Как передать объекты по ссылке в PHP 5?
В PHP 5 вы должны использовать модификатор &
для передачи по ссылке? Например,
class People() { }
$p = new People();
function one($a) { $a = null; }
function two(&$a) { $a = null; )
В PHP4 вам понадобился модификатор &
для поддержки ссылок после внесения изменений, но я смущен тем, которые я прочитал относительно автоматического использования сквозного ссылки на PHP5, за исключением случаев, когда экспликация клонирования объекта.
В PHP5 используется модификатор &
, необходимый для передачи по ссылке для всех типов объектов (переменных, классов, массивов,...)?
Ответы
Ответ 1
вам нужно использовать модификатор для передачи по ссылке?
Технически/семантически, ответ да, даже с объектами. Это связано с тем, что есть два способа передать/назначить объект: по ссылке или по идентификатору. Когда объявление функции содержит &
, как в:
function func(&$obj) {}
Аргумент будет передан по ссылке, независимо от того, что. Если вы объявляете без &
function func($obj) {}
Все будет передано по значению, за исключением объектов и ресурсов, которые затем будут передаваться через идентификатор. Какой идентификатор? Ну, вы можете думать об этом как о ссылке на ссылку. Возьмем следующий пример:
class A
{
public $v = 1;
}
function change($obj)
{
$obj->v = 2;
}
function makezero($obj)
{
$obj = 0;
}
$a = new A();
change($a);
var_dump($a);
/*
output:
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
makezero($a);
var_dump($a);
/*
output (same as before):
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
Итак, почему $a
вдруг не становится целым числом после передачи его на makezero
? Это потому, что мы только перезаписываем идентификатор. Если мы прошли по ссылке:
function makezero(&$obj)
{
$obj = 0;
}
makezero($a);
var_dump($a);
/*
output:
int(0)
*/
Теперь $a
является целым числом. Таким образом, существует разница между прохождением через идентификатор и прохождением через ссылку.
Ответ 2
Ты используешь это неправильно. Знак $является обязательным для любой переменной. Должен быть: http://php.net/manual/en/language.references.pass.php
function foo(&$a)
{
$a=null;
}
foo($a);
To return a reference, use
function &bar($a){
$a=5;
return $a
}
В объектах и массивах ссылка на объект копируется как формальный параметр, любые операции равенства на двух объектах - это обмен ссылками.
$a=new People();
$b=$a;//equivalent to &$b=&$a roughly. That is the address of $b is the same as that of $a
function goo($obj){
//$obj=$e(below) which essentially passes a reference of $e to $obj. For a basic datatype such as string, integer, bool, this would copy the value, but since equality between objects is anyways by references, this results in $obj as a reference to $e
}
$e=new People();
goo($e);
Ответ 3
Объекты будут передаваться по ссылке. Построенные типы будут передаваться по значению (скопированы);
Что происходит за кулисами, так это то, что когда вы передаете переменную, содержащую объект, это ссылка на объект. Таким образом, сама переменная копируется, но она по-прежнему ссылается на один и тот же объект. Итак, по существу, есть две переменные, но оба они указывают на один и тот же объект. Изменения, внесенные в объекты внутри функции, будут сохраняться.
В случае кода, который у вас есть (сначала вам нужно $even with &):
$original = new Object();
one($original); //$original unaffected
two($original); //$original will now be null
function one($a) { $a = null; } //This one has no impact on your original variable, it will still point to the object
function two(&$a) { $a = null; ) //This one will set your original variable to null, you'll lose the reference to the object.