Name binding

In programming languages, name binding is the association of entities (data and/or code) with identifiers. An identifier bound to an object is said to reference that object. Machine languages have no built-in notion of identifiers, but name-object bindings as a service and notation for the programmer is implemented by programming languages. Binding is intimately connected with scoping, as scope determines which names bind to which objects – at which locations in the program code (lexically) and in which one of the possible execution paths (temporally).

Use of an identifier id in a context that establishes a binding for id is called a binding (or defining) occurrence. In all other occurrences (e.g., in expressions, assignments, and subprogram calls), an identifier stands for what it is bound to; such occurrences are called applied occurrences.

Binding time

 * Static binding (or early binding) is name binding performed before the program is run.
 * Dynamic binding (or late binding or virtual binding) is name binding performed as the program is running.

An example of a static binding is a direct C function call: the function referenced by the identifier cannot change at runtime.

An example of dynamic binding is dynamic dispatch, as in a C++ virtual method call. Since the specific type of a polymorphic object is not known before runtime (in general), the executed function is dynamically bound. Take, for example, the following Java code:

is an interface, so  must refer to a subtype of it. may reference a, an  , or some other subtype of. The method referenced by  is not known until runtime. In C, which does not have dynamic binding, a similar goal may be achieved by a call to a function pointed to by a variable or expression of a function pointer type, whose value is unknown until it is evaluated at run-time.

Rebinding and mutation
Rebinding should not be confused with mutation or assignment.


 * Rebinding is a change to the referencing identifier.
 * Assignment is a change to (the referenced) variable.
 * Mutation is a change to an object in memory, possibly referenced by a variable or bound to an identifier.

Consider the following Java code:

The identifier  is bound to a variable in the first line; in the second, a reference an object (a linked list of strings) is assigned to the variable. The linked list referenced by the variable is then mutated, adding a string to the list. Next, the variable is assigned the constant. In the last line, the identifier is rebound for the scope of the block. Operations within the block access a new variable and not the variable previously bound to.

Late static
Late static binding is a variant of binding somewhere between static and dynamic binding. Consider the following PHP example:

In this example, the PHP interpreter binds the keyword  inside   to class , and so the call to   produces the string "hello". If the semantics of  had been based on late static binding, then the result would have been "bye".

Beginning with PHP version 5.3, late static binding is supported. Specifically, if  in the above were changed to   as shown in the following block, where the keyword   would only be bound at runtime, then the result of the call to   would be "bye":