Может быть полезно думать об этом так: в PHP все переменные действительно являются своего рода указателем: записи в таблице символов - то, что отображает имена переменных в значения - содержат zval *
в C реализация Zend Engine.
Во время присваивания - это включает установку аргументов функции - произойдет волшебство:
Если вы сделаете $a = $b
, будет создана копия значения, на которое указывает запись в таблице символов $b
, и указатель на это новое значение будет помещен в запись таблицы символов для $a
. Теперь $a
и $b
будут указывать на разные значения. PHP использует это как соглашение о вызовах по умолчанию.
Если вы сделаете $a =& $b
, запись таблицы символов для $a
будет установлена на указатель, содержащийся в записи таблицы символов для $b
. Это означает, что $a
и $b
теперь указывают на одно и то же значение - они являются псевдонимами друг друга с равными правами, пока программист не восстановит их. Также обратите внимание, что $a
на самом деле не является ссылкой на $b
- они оба являются указателями на один и тот же объект.
Вот почему называть их «псевдонимами» может быть хорошей идеей, чтобы подчеркнуть различия с эталонной реализацией C ++:
В C ++ переменная, содержащая значение и ссылку, созданную из этой переменной, не равны - вот почему существуют такие вещи, как висячие ссылки.
Для ясности: в PHP нет такого понятия, как ссылочный тип, поскольку все переменные уже реализованы внутри как указатели, и поэтому каждая из них может действовать как ссылка.
Объекты PHP5 по-прежнему согласуются с этим описанием - они не передаются по ссылке, но указатель на объект (руководство называет его «идентификатором объекта» - это может не должен быть реализован как фактический указатель C - я не проверял это) передается значением (имеется в виду, скопировано при назначении, как описано выше).
Проверьте в руководстве подробности о связи между объектами PHP5 и ссылками .