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

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

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

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

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

Ответ 1

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

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

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 является целым числом. Таким образом, существует разница между прохождением через идентификатор и прохождением через ссылку.

Ответ 2

Ты используешь это неправильно. Знак $является обязательным для любой переменной. Должен быть:   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);

Ответ 3

Объекты будут передаваться по ссылке. Построенные типы будут передаваться по значению (скопированы);

Что происходит за кулисами, так это то, что когда вы передаете переменную, содержащую объект, это ссылка на объект. Таким образом, сама переменная копируется, но она по-прежнему ссылается на один и тот же объект. Итак, по существу, есть две переменные, но оба они указывают на один и тот же объект. Изменения, внесенные в объекты внутри функции, будут сохраняться.

В случае кода, который у вас есть (сначала вам нужно $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.