Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели языка Си и не являются псевдонимами таблицы символов. В PHP имя переменной и её содержимое - это разные вещи, поэтому одно содержимое может иметь разные имена. Ближайшая аналогия - имена файлов Unix и файлы - имена переменных являются элементами каталогов, а содержимое переменных это сами файлы. Ссылки в PHP - аналог жёстких ссылок (hardlinks) в файловых системах Unix. Жесткие ссылки в PHPЖесткая ссылка представляет собой просто переменную, которая
является синонимом другой переменной. Многоуровневые ссылки (то есть,
ссылка на ссылку на переменную, как это можно делать, например, в Perl)
не поддерживаются. Так что не стоит воспринимать жесткие ссылки
серьезнее, чем синонимы. $a=10; Ссылаться можно не только на переменные, но и на элементы массива (этим жесткие ссылки выгодно отличаются от символических). Например: $A=array('a' => 'aaa', 'b' => 'bbb'); Впрочем, элемент массива, для которого планируется создать символическую ссылку, может и не существовать. Как в следующем случае: $A=array('a' => 'aaa', 'b' => 'bbb'); В результате выполнения рассмотренного скрипта, хотя ссылке $b и не было ничего присвоено, в массиве $A создастся новый элемент с ключом c и значением — пустой строкой (мы можем это определить по результату работы echo). То есть, жесткая ссылка на самом деле не может ссылаться на несуществующий объект, а если делается такая попытка, то объект создается. Примечание: Если убрать строку, в которой создается жесткая ссылка, то будет выведено сообщение о том, что элемент с ключом c не определен в массиве $A. Жесткие ссылки удобно применять при передаче параметров пользовательской функции и возврате значения из нее. Символические ссылки (переменные переменные) Символическая ссылка — это всего лишь строковая переменная, хранящая имя другой переменной. Чтобы добраться до значения переменной, на которую ссылается символическая ссылка, необходимо применить дополнительный знак $ перед именем ссылки. Рассмотрим пример: $a=10; Мы видим, что для того, чтобы использовать обычную строковую переменную как ссылку, нужно перед ней поставить еще один символ $.Это говорит интерпретатору, что надо взять не значение самой $p, а значение переменной, имя которой хранится в переменной $p. Символические ссылки (переменные переменные) используюся достаточно редко. Жесткие ссылки и пользовательские функцииПередача значений по ссылке Вы можете передавать переменные в пользовательскую функцию по ссылке, если вы хотите разрешить функции модифицировать свои аргументы. В таком случае, пользовательския функция сможет изменять аргументы. Синтаксис таков: function foo(&$var) Заметьте, что в вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке. Еще один интересный пример: function funct(&$string) По ссылке можно передавать:
function &bar() Любое другое выражение не должно передаваться по ссылке, так как результат не определён. Например, следующая передача по ссылке является неправильной: function bar() // Операция & отсутствует Возврат значений по ссылке Рассмотрим еще одну возможность пользовательских функций PHP - возврат ссылок. Возвращение по ссылке используется в тех случаях, когда вы хотите использовать функцию для выбора переменной, с которой должна быть связана данная ссылка. При возвращении по ссылке используйте такой синтаксис: function &find_var($param) В этом примере устанавливается свойство объекта, возвращённого функцией find_var, а не его копии, как было бы без использования ссылок. Еще один пример возврата значений пользовательской функции по ссылке: php Удаление ссылок (сброс ссылок)При удалении ссылки, просто разрывается связь имени и содержимого переменной. Это не означает, что содержимое переменной будет разрушено. Например: $a = 1; Этот код не сбросит $b, а только $a. И все же, жесткая ссылка — не абсолютно точный синоним объекта, на который она ссылается. Дело в том, что оператор Unset(), выполненный для жесткой ссылки, не удаляет объект, на который она ссылается, а всего лишь разрывает связь между ссылкой и объектом. Итак, жесткая ссылка и переменная (объект), на которую она ссылается, совершенно равноправны, но изменение одной влечет изменение другой. Оператор Unset() разрывает связь между объектом и ссылкой, но объект удаляется только тогда, когда на него никто уже не ссылается. Опять же, можно провести аналогию с вызовом unlink (в Unix). Источник: http://www.srubil.ru | |
| |
Просмотров: 420 | | |
Всего комментариев: 0 | |