Ниже приведен текст из руководства по PHP:
PHP обрабатывает объекты так же, как ссылки или дескрипторы, то есть
что каждая переменная содержит ссылку на объект, а не копию
весь объект.Ссылка PHP — это псевдоним, который позволяет двум
разные переменные для записи в одно и то же значение. Начиная с PHP 5, объект
Переменная больше не содержит сам объект в качестве значения. Это только
содержит идентификатор объекта, который позволяет объектам доступа найти
фактический объект. Когда объект передается по аргументу, возвращается или
присвоенные другой переменной, эти переменные не являются псевдонимами:
они содержат копию идентификатора, который указывает на тот же объект.
После прочтения приведенного выше текста у меня возникли следующие сомнения:
Как функционируют все вышеперечисленные объекты?
Может ли кто-нибудь, пожалуйста, прояснить мои сомнения в понятном, простом и ясном языке кратко и пошагово?
Было бы замечательно, если бы кто-то мог объяснить эти концепции с помощью некоторого подходящего рабочего примера кода с пояснительными комментариями в соответствующих местах кода.
Если возможно, кто-то может также объяснить с помощью наглядного представления работы этих понятий. Это будет высоко ценится.
Вы можете взять следующий пример или указать свой собственный подходящий пример, чтобы объяснить все вышеперечисленные понятия.
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a;
$b->foo = 2;
echo $a->foo."\n";$c = new A;
$d = &$c;$d->foo = 2;
echo $c->foo."\n";$e = new A;
function foo($obj) {
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
Благодарю вас.
Ссылки на ссылки из руководства по PHP:
Object
это экземпляр класса, который вы создаете с new Classname
,Object Reference
переменная PHP, значение которой является Object
,Object Identifier
это значение, внутреннее для реализации PHP, которое идентифицирует конкретный объект. Вероятно, это что-то вроде индекса в массиве, который содержит указатели на все объекты.Object accessors
являются операциями, которые обращаются к содержимому объектов, таких как $d->foo
,Это всего лишь подробности реализации того, как вы можете иметь несколько переменных, ссылающихся на один и тот же объект, без необходимости явного использования ссылочных переменных.
$a = new A;
$b = $a;
$a->foo = 2;
echo $b->foo; // echoes 2
Присвоение не делает копию объекта, это просто копирование идентификатора объекта. Все копии идентификатора объекта ссылаются на один и тот же объект. Думайте об этом как о указателе в таких языках, как C или C ++ — когда вы копируете указатель, обе переменные ссылаются на одну и ту же память.
Чтобы сделать копию объекта, вы должны использовать clone
,
$c = clone $a;
Это отличается от того, как работают массивы, когда назначение делает копию, если вы не используете явную ссылочную переменную. (В качестве оптимизации PHP использует копирование при записи, так что он на самом деле не копирует массив памяти, если вы не измените его.)
$x = array(1);
$y = $x;
$z = &$x;
$x[0] = 2;
echo $y[0]; // echoes 1
echo $z[0]; // echoes 2
Других решений пока нет …