Задать вопрос
@wideShift

Что происходит при создании объекта класса(при наследовании) в PHP?

Меня интересует жизненный цикл: от момента создания экземпляра до уничтожения объекта.
class A {}
class B extends A {}
class C extends B {}
new C();

Как я предполагаю:
1) Выделяем память под новый объект
2) В пустой объект добавляем все методы и свойства из класса A, потом из B , и из С (переопределяя, если есть одинаковые свойства или методы).
3) Вызываем конструктор класса C
4) Используем объект...
5) Далее сборщик мусора: если нет ссылок, указывающих на созданный объект, то вызывает деструктор из нашего объекта (если есть) и удаляет сам объект.
  • Вопрос задан
  • 282 просмотра
Подписаться 3 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@rPman
Боюсь у вас все как то переусложнено.

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

Соответственно виртуальных методов нет, точнее они работают так автоматически, т.е. можно считать все методы виртуальными.

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

Деструктор будет вызван если закончится работа приложения, закончатся ссылки (это кстати не факт, висячие могут жить до конца приложения, и даже unset не вызовет деструктор если есть ссылки на объект) и закончится область видимости переменной в которую поместили объект.
пример:
class A
{
	public $a;
	function __construct(){echo '{C}';}
	function __destruct(){echo '[';unset($this->a);echo 'D]';}
}

echo 1;
$a=new A();$b=new A();
$b->a=$a;$a->a=$b; // закоментируй, тогда деструктор будет вызван до вывода 2 иначе после
unset($a);unset($b);
echo 2;

если есть ссылки:1{C}{C}2[[D]D]
если ссылок нет: 1{C}{C}[D][D]2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы