Intereting Posts
Защитите файл Excel с помощью PHPExcel проанализировать переменные js js для php, используя AJAX Почему Eclipse PHP не распознает объявления пространства имен? Laravel 5: как делать многопоточные комментарии Я не могу найти dompdf_config.inc.php или dompdf_config.custom.inc.php для установки «DOMPDF_UNICODE_ENABLED» true Зависимость Ад – как передать зависимости глубоко глубоко вложенным объектам? отображать различный суффикс для каждого элемента массива в codeigniter php Несколько fbAsyncInit? Присоединиться к тому, где запрос в Laravel возвращает неверные временные метки Таблица Pivot MySQL с динамическими столбцами Как проверить, установлен ли $ _GET , и он не пуст, используя php Ошибка учетной записи службы SDK Google Диска «Аутентифицированный пользователь не установил приложение с идентификатором клиента …» использование флага rot -G в php Загрузка .amr с помощью codeigniter Как использовать инъекцию зависимостей в Zend Framework?

Объекты в PHP передаются по значению или ссылке?

В этом коде:

<?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 только локальной переменной который перестанет существовать в конце функции?

Related of "Объекты в PHP передаются по значению или ссылке?"

Почему бы не запустить функцию и не узнать?

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