В этом коде:
<?php class Foo { var $value; function foo($value) { $this->setValue($value); } function setValue($value) { $this->value=$value; } } class Bar { var $foos=array(); function Bar() { for ($x=1; $x<=10; $x++) { $this->foos[$x]=new Foo("Foo # $x"); } } function getFoo($index) { return $this->foos[$index]; } function test() { $testFoo=$this->getFoo(5); $testFoo->setValue("My value has now changed"); } } ?>
Когда запускается метод Bar::test()
и он изменяет значение foo # 5 в массиве объектов foo, будет затронуто фактическое foo # 5 в массиве или будет переменной $testFoo
только локальной переменной который перестанет существовать в конце функции?
Почему бы не запустить функцию и не узнать?
$b = new Bar; echo $b->getFoo(5)->value; $b->test(); echo $b->getFoo(5)->value;
Для меня приведенный выше код (вместе с вашим кодом) произвел этот вывод:
Foo #5 My value has now changed
Это происходит не из-за «передачи по ссылке», однако это связано с «присвоением по ссылке». В PHP 5 назначение по ссылке – это поведение по умолчанию с объектами. Если вы хотите назначить по значению вместо этого, используйте ключевое слово clone .
Вы можете обратиться к http://ca2.php.net/manual/en/language.oop5.references.php за фактический ответ на свой вопрос.
Одним из ключевых моментов ООП PHP5, который часто упоминается, является то, что «объекты передаются по ссылкам по умолчанию». Это не совсем так.
Ссылка PHP – это псевдоним, который позволяет двум различным переменным писать одно значение. Начиная с PHP5, объектная переменная больше не содержит объект как значение. Он содержит только идентификатор объекта, который позволяет объектным аксессуарам находить фактический объект. Когда объект отправляется аргументом, возвращенным или назначенным другой переменной, разные переменные не являются псевдонимами: они содержат копию идентификатора, которая указывает на тот же объект.
Они передаются по значению в PHP 4 и по ссылке в PHP 5. Чтобы передавать объекты по ссылке в PHP 4, вы должны явно отмечать их как таковые:
$obj = &new MyObj;