@ Salman A, который работает только для скаляров, поведение отличается для объектов, когда они передаются по ссылке или нет.Похоже, что нет никакой реальной разницы между этими двумя методами!
<?php
class X
{
static $instances = 0;
public $instance;
public $str;
function __construct($str)
{
$this->instance = ++self::$instances;
$this->str = $str;
}
public function __toString()
{
return "instance: ".$this->instance." str: ".$this->str;
}
}
class Y extends X
{
public function __toString()
{
return "Y:".parent::__toString();
}
}
// Pass NORMAL
function modify_1($o)
{
$o->str = __FUNCTION__;
}
// Pass BY-REFERENCE
function modify_2(&$o)
{
$o->str = __FUNCTION__;
}
// Pass NORMAL - Obj Replace
function modify_3($o)
{
$o = new Y(__FUNCTION__);
}
// Pass BY-REFERENCE - Obj Replace
function modify_4(&$o)
{
$o = new Y(__FUNCTION__);
}
$x = new X('main');
echo "$x\n";
modify_1($x);
echo "$x\n";
modify_2($x);
echo "$x\n";
modify_3($x);
echo "$x\n";
modify_4($x);
echo "$x\n";
Это сгенерировало вывод ниже;
instance: 1 str: main
instance: 1 str: modify_1
instance: 1 str: modify_2
instance: 1 str: modify_2
Y:instance: 3 str: modify_4
Я ожидал
instance: 1 str: main
instance: 1 str: main
instance: 1 str: modify_2
instance: 1 str: modify_2
Y:instance: 3 str: modify_4
Итак, мой вывод таков;похоже, это работает, если мы имеем дело с объектом (самим собой) или скаляром;но не свойство объекта или его метод.