Я обнаружил странное поведение при передаче параметра по ссылке на метод объекта:
class Test { private $value; public function Set($value) { $this->value = $value; } public function Get(&$ref) { $ref = &$this->value; //SET REF PARAMETER TO THIS VALUE BY REF } } $test = new Test(); $test->Set('test'); $test->Get($value1); var_dump($value1); //NULL INSTEAD OF 'test'!
edit: имя GetByRef (…) было неправильным для этого примера, переименовано в: Get (…)
edit2: Я забыл реальный тестовый пример, где я застрял:
$test->Get($value1); $test->Get($value2); $value1 = 'Another test value'; echo $value2; //SHOULD BE SAME: 'Another test value';
$ value2 не знает, создано ли значение1 или нет, поэтому стандартный $ value2 = & $ value1 здесь не работает.
Вы назначаете ссылку по ссылке. Вот почему вы получаете null
. Он отлично работает, если вы обычно назначаете:
public function GetByRef(&$ref) { $ref = $this->value; }
Объявляя &$ref
в сигнатуре метода и вызывая метод, в области вызова создается переменная с значением по умолчанию null
, на которое ссылается внутри метода как $ref
. Делая значение $ref = &$this->value
вы в основном удаляете эту ссылку и создаете новую ссылку $ref
. Использование =&
всегда создает новую ссылочную переменную; если вы хотите изменить его значение вместо этого, вы должны использовать =
для его назначения. Таким образом, переменная, которая была создана в области вызова, остается установленной при ее начальном значении null
и ее ссылка на $ref
внутри метода нарушена.