Что такое сущности «объект», «ссылка на объект», «идентификатор объекта», «средства доступа к объектам» в PHP? Как они функционируют?

Ниже приведен текст из руководства по PHP:

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

Ссылка PHP — это псевдоним, который позволяет двум
разные переменные для записи в одно и то же значение. Начиная с PHP 5, объект
Переменная больше не содержит сам объект в качестве значения. Это только
содержит идентификатор объекта, который позволяет объектам доступа найти
фактический объект. Когда объект передается по аргументу, возвращается или
присвоенные другой переменной, эти переменные не являются псевдонимами:
они содержат копию идентификатора, который указывает на тот же объект.

После прочтения приведенного выше текста у меня возникли следующие сомнения:

  1. Что именно «Объект» является?
  2. Что именно «Ссылка на объект» является?
  3. Что именно «Идентификатор объекта» является?
  4. Является ли объект называется «Идентификатор объекта» работать неявно / внутренне?
  5. Как создать копию «Идентификатор объекта»?
  6. Сделать условия «Ссылка на объект» а также «Идентификатор объекта» значит то же самое?
  7. Что именно «Объекты доступа» являются?
  8. Сделать условия «Экземпляр класса», «Экземпляр объекта», «Переменная объекта», «Экземпляр класса», «Экземпляр объекта» значит то же самое? Если да, на что указывают эти объекты? Если нет, каковы различия между их значениями?

Как функционируют все вышеперечисленные объекты?

Может ли кто-нибудь, пожалуйста, прояснить мои сомнения в понятном, простом и ясном языке кратко и пошагово?

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

Если возможно, кто-то может также объяснить с помощью наглядного представления работы этих понятий. Это будет высоко ценится.

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

<?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:

  1. https://secure.php.net/manual/en/oop5.intro.php#oop5.intro
  2. https://secure.php.net/manual/en/language.oop5.references.php#language.oop5.references

0

Решение

  1. Object это экземпляр класса, который вы создаете с new Classname,
  2. Object Reference переменная PHP, значение которой является Object,
  3. Object Identifier это значение, внутреннее для реализации PHP, которое идентифицирует конкретный объект. Вероятно, это что-то вроде индекса в массиве, который содержит указатели на все объекты.
  4. Да, они внутренние, не видны приложениям PHP.
  5. Присвойте переменную, содержащую объект, другой переменной. Внутри обе переменные содержат копии идентификатора объекта.
  6. Они не одно и то же, но тесно связаны. Ссылка на объект — это переменная PHP, идентификатор объекта — это внутренние данные, которые она содержит.
  7. Object accessors являются операциями, которые обращаются к содержимому объектов, таких как $d->foo,
  8. Да, все они, по сути, синонимы.

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]