В php5 объекты передаются по ссылке?
Я не могу получить какую-либо последовательную информацию об этом. Различные источники, кажется, говорят разные вещи и почтенный php.net сам (появляется) не для того, чтобы прямо заявить об этом - хотя, должен признаться, я только быстро взглянул.
в случаях, когда я передаю "тяжелые" объекты, мне нужно пройти по ссылке, но я не хочу продолжать печатать:
function foo(TypeName& $obj)
Если я могу уйти с просто
function foo(TypeName $obj)
Так что же делает стандарт сказать?
8 ответов:
объекты передаются (и назначаются) по ссылке. Нет необходимости использовать адрес оператора.
конечно, то, что я набрал, является чрезмерным упрощением, но будет соответствовать вашим целям. Элемент документация гласит:
один из ключевых моментов PHP5 ООП, что часто упоминается, что "объекты передаются по ссылкам по умолчанию". Это не совсем так. Этот раздел исправляет эту общую мысль используя некоторые примеры.
A PHP ссылка-это псевдоним, который позволяет использовать две различные переменные запись в то же значение. По состоянию на PHP5, объектная переменная не содержит объект сам по себе как значение больше. Оно содержит только идентификатор объекта что позволяет найти методы доступа к объектам реальный объект. Когда объект отправлено аргументом, возвращено или назначено к другой переменной, другой переменные не являются псевдонимами: они содержат копия идентификатора, который указывает к тому же объект.
для более подробного объяснения (объясняет чрезмерное упрощение, а также идентификаторы) проверьте ответ.
вы можете передать переменную по ссылке функции, так что функция может измените переменную. Синтаксис следует:
<?php function foo(&$var) { $var++; } $a=5; foo($a); // $a is 6 here ?>Примечание: нет ссылка на функция только для вызова функции определение. Определение функции в одиночку достаточно правильно пройти аргумент по ссылке. По состоянию на PHP 5.3.0, вы получите предупреждение о том, что "call-time pass-by-reference" является устаревшие, когда вы используете & в foo (&$a);.
в PHP 5, инфраструктура объектная модель была переписана для работы с помощью дескрипторов объектов. Если вы явное клонирование объекта с помощью ключевое слово clone вы никогда не будете создание за кадром дубликатов свои объекты. В PHP 5 есть нет необходимости передавать объекты мимо ссылка или присвоение их путем ссылка
поэтому единственный раз, когда вам нужно использовать
function foo(&$var)синтаксис, если $var не может быть экземпляром класса.
это кажется немного более точным, значение объекта передается по значению, но значение самого объекта является указателем. Это отличается от просто передачи ссылки.
On http://www.php.net/manual/en/language.oop5.references.php приведенный пример хорош. В первом наборе $a = NULL; не влияет на $b, так как $A был просто указателем. Во втором наборе $c = NULL; вызывает $ d быть NULL, так как $d является ссылкой на $c.
<?php class A { public $foo = 1; } $a = new A; $b = $a; $a->foo = 2; $a = NULL; echo $b->foo."\n"; // 2 $c = new A; $d = &$c; $c->foo = 2; $c = NULL; echo $d->foo."\n"; // Notice: Trying to get property of non-object... ?>
начиная с PHP 5, все объекты передаются и назначаются по ссылке.
в PHP 4 Вам все равно нужно указать, где вы хотите, чтобы объекты передавались по ссылке, явно используя
&оператора.
короткий ответ:да. От объекты и ссылки:
один из ключевых моментов PHP5 ООП, что часто упоминается, что "объекты передаются по ссылкам по умолчанию". Это не совсем так. Этот раздел исправляет эту общую мысль используя некоторые примеры.
ссылка PHP-это псевдоним, который позволяет использовать две различные переменные запись в то же значение. По состоянию на PHP5, объектная переменная не имеет содержать объект сам по себе как значение больше. Оно содержит только идентификатор объекта что позволяет найти методы доступа к объектам реальный объект. Когда объект отправлено аргументом, возвращено или назначено к другой переменной, другой переменные не являются псевдонимами: они содержат копия идентификатора, который указывает к тому же объекту.
важно то, что в случае, который вас беспокоит, вы никогда не будете делать копию объекта, если вы явно не используете clone ключевое слово в вызове функции. Является ли это псевдонимом или идентификатором, этот факт не меняет.
да начиная с PHP5, объекты передаются по ссылке. Нет необходимости делать это явно.
http://www.php.net/manual/en/migration5.oop.php
в PHP 5 появилась новая объектная модель. Обработка объектов PHP была полностью переписана, что позволило повысить производительность и расширить возможности. В предыдущих версиях PHP объекты обрабатывались как примитивные типы (например, целые числа и строки). Недостатком этого метода было то, что семантически весь объект копировался при назначении переменной или передавался в качестве параметра методу. В новом подходе объекты ссылаются на дескриптор, а не на значение (можно думать о дескрипторе как идентификаторе объекта).
просто пример, где передача "объектов" по ссылке полезна:
class RefTest1 { public $foo; public function __construct(RefTest2 &$ref = null) { $this->foo =& $ref; } } class RefTest2 { public $foo; public function __construct(RefTest1 &$ref = null) { $this->foo =& $ref; } } class RefTest3 { public $foo; public function __construct(RefTest2 &$ref = null) { $this->foo =& $ref; } } class DoCrossRef { public $refTest1; public $refTest2; public function __construct() { $this->refTest1 = new RefTest1($this->refTest2); $this->refTest2 = new RefTest2($this->refTest1); } public function changeReference() { $this->refTest1 = new RefTest3($this->refTest2); } }в конце
RefTest1содержит ссылку наRefTest2и наоборот, еслиRefTest2объект не существовал в то время .после вызова
DoCrossRef->changeReference()наRefTest2объекты также содержит ссылку на новые
вот еще один пример, подтверждающий, что объекты передаются по ссылке.
<?php // discussion: https://stackoverflow.com/questions/2715026/are-php5-objects-passed-by-reference#_=_ class A { public $foo = 1; } class B { function inc($obj) { $obj->foo++; } } $objA = new A(); $objB = new B(); $objB->inc($objA); echo "[" . $objA->foo . "]"; // Outputs [2]
Comments