Как передать объекты по ссылке в PHP 5?

В PHP 5 вы должны использовать & модификатор для передачи по ссылке? Например,

 class People() { } $p = new People(); function one($a) { $a = null; } function two(&$a) { $a = null; ) 

В PHP4 вам понадобился & модификатор, чтобы поддерживать ссылку после внесения изменений, но я смущен тем, которые я прочитал относительно автоматического использования PHP5 для передачи по ссылке, за исключением случаев, когда экспликация клонирует объект.

В PHP5 является & модификатором, обязательным для передачи по ссылке для всех типов объектов (переменных, классов, массивов, …)?

Related of "Как передать объекты по ссылке в PHP 5?"

вам нужно использовать & модификатор для передачи по ссылке?

Технически / семантически, ответ да , даже с объектами. Это связано с тем, что есть два способа передать / назначить объект: по ссылке или по идентификатору . Когда объявление функции содержит символ & , как в:

 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);