В языках программирования привязка имени представляет собой ассоциацию сущностей (данных и / или кода) с идентификаторами . Идентификатор, связанный с объектом, называется ссылкой на этот объект. Машинные языки не имеют встроенного понятия идентификаторов, но привязки имя-объект как услуга и нотация для программиста реализованы языками программирования. Связывание тесно связано с областью действия, поскольку область действия определяет, какие имена связаны с какими объектами - в каких местах программного кода (лексически ) и в каком из возможных путей выполнения (временно ).
Использование идентификатора id
в контексте, который устанавливает привязку для id
, называется вхождением привязки (или определения). Во всех других случаях (например, в выражениях, назначениях и вызовах подпрограмм) идентификатор обозначает то, с чем он связан; такие случаи называются прикладными случаями.
Примером статического связывания является прямое Вызов функции C : функция, на которую ссылается идентификатор, не может измениться во время выполнения.
Но примером динамического связывания является динамическая отправка, как в вызове виртуального метода C ++. Поскольку конкретный тип полиморфного объекта неизвестен до времени выполнения (в общем случае), выполняемая функция динамически связана. Возьмем, например, следующий код Java :
public void foo (java.util.Listlist) {list.add ("bar"); }
Список
- это интерфейс, поэтому список
должен ссылаться на его подтип . Это ссылка на LinkedList
, ArrayList
или какой-либо другой подтип из List
? Фактический метод, на который ссылается add
, неизвестен до времени выполнения. В C таким экземпляром динамического связывания может быть вызов функции, на которую указывает переменная или выражение типа указателя функции, значение которого неизвестно, пока оно не будет фактически оценено во время выполнения.
Повторное связывание не следует путать с мутацией.
Рассмотрим следующий код Java :
LinkedListlist ; список = новый LinkedList (); list.add ("фу"); список = ноль;
Идентификатор list
изначально ни на что не ссылается (это неинициализированный ); затем он повторно связывается для ссылки на объект (связанный список строк). Связанный список, на который ссылается list
, затем изменяется, добавляя строку в список. Наконец, list
повторно привязан к null
.
Поздняя статическая привязка - это вариант привязки где-то между статической и динамической привязкой. Рассмотрим следующий пример PHP :
class A {static $ word = "hello"; статическая функция hello () {print self :: $ word; }} класс B расширяет A {static $ word = "bye"; } B :: hello ();
В этом примере интерпретатор PHP связывает ключевое слово self
внутри A :: hello ()
с классом A
, и поэтому вызов B :: hello ()
производит строку «привет». Если бы семантика self :: $ word
была основана на позднем статическом связывании, то результатом было бы «пока».
Начиная с версии PHP 5.3, поддерживается позднее статическое связывание. В частности, если self :: $ word
в приведенном выше был изменен на static :: $ word
, как показано в следующем блоке, где ключевое слово static
будет только быть привязанным во время выполнения, тогда результатом вызова B :: hello ()
будет "пока":
class A {static $ word = "hello"; статическая функция hello () {print static :: $ word; }} класс B расширяет A {static $ word = "bye"; } B :: hello ();