В PHP, когда $ foo = new Foo (), технически говоря, является ли $ foo объектом или является ли $ foo ссылкой? - PullRequest
1 голос
/ 18 октября 2010

Обновление: в

http://php.net/manual/en/language.oop5.references.php

там написано:

Одним из ключевых моментов ООП PHP5, который часто упоминается, является то, что «объекты передаются по ссылкам по умолчанию».Это не совсем верно.

Почему это так?Следующее является причиной, которую я не знаю, является ли она истинной или нет:

Я думаю, что в общих чертах можно сказать, что foo является объектом или экземпляром класса Foo.

Но верно ли, что с технической точки зрения foo - это просто ссылка, точно так же, как в Java и в Ruby, где переменная foo всегда является просто ссылкой на объект.

Таквот почему в PHP

function add($obj) {
  $obj->a++;
}

Мы не говорим «передача по ссылке», но очень технически говоря, мы передаем значение, которое является ссылкой.Таким образом, это «прохождение эталона», а не «прохождение по эталону».

Но, еслив PHP мы говорим, что foo - это объект, тогда я думаю, что «передача по ссылке» может иметь смысл.Так это правда?Говорят, что foo является ссылкой на объект, а не на объект, поэтому мы просто «передаем по значению»?

Ответы [ 3 ]

1 голос
/ 18 октября 2010

$foo это не объект, это ссылка. Сказать, что $foo является объектом, является ошибкой, $foo является ссылкой, указывающей на объект.

Ссылки передаются по значению, как и любые другие аргументы в PHP (в том числе в Java и Ruby), поэтому вы не можете напрямую назначить ссылку для ее изменения, но вы можете работать с любым объектом, на который он указывает.

Чтобы упростить абстракцию, программисты иногда говорят, что «$foo - это объект», это неправильно, но это проще, чем сказать, что «$foo - это ссылка, указывающая на объект». Во многих случаях разница на самом деле не имеет значения, за исключением некоторых краевых случаев.

0 голосов
/ 27 ноября 2010

Переменная объекта PHP на самом деле не содержит объект (как и во многих других языках) - она ​​содержит «дескриптор» объекта - то есть некоторое значение, которое позволяет идентифицировать объект, найти его и манипулировать им.Эта переменная передается как любая другая - ее можно передавать by-val, by-ref и т. Д. Однако, если вы копируете это значение в другую переменную, все происходит как одинаково, так и отличается от того, что происходит с целым числом или строкой.

Integer / String: значение копируется, поэтому при его изменении другой остается неизменным.

Object: значение копируется, но значение является дескриптором.Таким образом, если этот дескриптор используется для доступа к реальному объекту (который является практически единственным способом использовать этот дескриптор), и этот доступ модифицирует его, тогда другая переменная - независимая, но содержащая тот же дескриптор - будет отражать это изменение.

Так что это на самом деле очень непротиворечиво, только немного не то, что вы ожидаете рассматривать «по значению» и «по ссылке» наивно - поскольку то, что передается, на самом деле отличается для скалярных и объектных переменных.Переменные объекта включают в себя уровень косвенности.

Именно поэтому почти никогда не имеет смысла передавать переменную объекта по ссылке - если только вы не хотите заменить один объект другим в функции.

0 голосов
/ 18 октября 2010

Все объекты по умолчанию передаются по ссылке в PHP 5+, перед тем как PHP 5 для передачи по ссылке вы использовали оператор "&"

Это означает, что если вы передадите объект в метод, ссылка будет скопирована, а другая переменная внутри метода будет содержать копию ссылки.

Таким образом, вы не передаете ссылку по ссылке по умолчанию :), поэтому вы не можете присвоить переменной, содержащей копию ссылки, новое значение и повлиять на исходную ссылку.

...