В PHP 5 вы должны использовать &
модификатор для передачи по ссылке? Например,
class People() { } $p = new People(); function one($a) { $a = null; } function two(&$a) { $a = null; )
В PHP4 вам понадобился &
модификатор, чтобы поддерживать ссылку после внесения изменений, но я смущен тем, которые я прочитал относительно автоматического использования PHP5 для передачи по ссылке, за исключением случаев, когда экспликация клонирует объект.
В PHP5 является &
модификатором, обязательным для передачи по ссылке для всех типов объектов (переменных, классов, массивов, …)?
вам нужно использовать & модификатор для передачи по ссылке?
Технически / семантически, ответ да , даже с объектами. Это связано с тем, что есть два способа передать / назначить объект: по ссылке или по идентификатору . Когда объявление функции содержит символ &
, как в:
function func(&$obj) {}
Аргумент будет передан по ссылке, несмотря ни на что. Если вы заявляете без &
function func($obj) {}
Все будет передано по значению, за исключением объектов и ресурсов, которые затем будут передаваться через идентификатор . Что такое идентификатор? Ну, вы можете думать об этом как о ссылке на ссылку. Возьмем следующий пример:
class A { public $v = 1; } function change($obj) { $obj->v = 2; } function makezero($obj) { $obj = 0; } $a = new A(); change($a); var_dump($a); /* output: object(A)#1 (1) { ["v"]=> int(2) } */ makezero($a); var_dump($a); /* output (same as before): object(A)#1 (1) { ["v"]=> int(2) } */
Так почему же $a
вдруг не становится целым числом после передачи его в makezero
? Это потому, что мы только перезаписываем идентификатор . Если мы пройдем по ссылке :
function makezero(&$obj) { $obj = 0; } makezero($a); var_dump($a); /* output: int(0) */
Теперь $a
является целым числом. Таким образом, существует разница между прохождением через идентификатор и прохождением через ссылку .
Объекты будут проходить по ссылке. Построенные типы будут передаваться по значению (копируются);
То, что происходит за кулисами, заключается в том, что когда вы передаете переменную, содержащую объект, это ссылка на объект. Таким образом, сама переменная копируется, но она по-прежнему ссылается на один и тот же объект. Итак, по существу, есть две переменные, но оба они указывают на один и тот же объект. Изменения, внесенные в объекты внутри функции, будут сохраняться.
В случае кода, который у вас есть (сначала вам нужно $ even with &):
$original = new Object(); one($original); //$original unaffected two($original); //$original will now be null function one($a) { $a = null; } //This one has no impact on your original variable, it will still point to the object function two(&$a) { $a = null; ) //This one will set your original variable to null, you'll lose the reference to the object.
Вы используете это неправильно. Знак $ является обязательным для любой переменной. Это должно быть: http://php.net/manual/en/language.references.pass.php
function foo(&$a) { $a=null; } foo($a); To return a reference, use function &bar($a){ $a=5; return $a }
В объектах и массивах ссылка на объект копируется как формальный параметр, любые операции равенства на двух объектах – это обмен ссылками.
$a=new People(); $b=$a;//equivalent to &$b=&$a roughly. That is the address of $b is the same as that of $a function goo($obj){ //$obj=$e(below) which essentially passes a reference of $e to $obj. For a basic datatype such as string, integer, bool, this would copy the value, but since equality between objects is anyways by references, this results in $obj as a reference to $e } $e=new People(); goo($e);