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 followingList
is an interface, so list
must refer to a subtype of it. list
may reference a LinkedList
, an ArrayList
, or some other subtype of List
. The method referenced by add
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 followinglist
is bound to a variable in the first line; in the second, 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 null
. 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 list
.
Late static
Late static binding is a variant of binding somewhere between static and dynamic binding. Consider the following PHP example:self
inside A::hello()
to class A
, and so the call to B::hello()
produces the string "hello". If the semantics of self::$word
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 self::$word
in the above were changed to static::$word
as shown in the following block, where the keyword static
would only be bound at runtime, then the result of the call to B::hello()
would be "bye":
See also
* *References
{{reflist Programming language concepts Articles with example Java code Definition ja:束縛 (情報工学) pt:Vinculação de nomes (computação)