класс — замена объекта изнутри себя

Мне было интересно, это плохая практика (я предполагаю, что это так) делать что-то подобное в PHP? Здравый смысл подсказывает мне, что это может привести к UB, но я не смог найти ссылку на это ни в руководстве, ни где-либо еще.

<?php
class A
{
public function __construct(){}
}
class B extends A
{
public function __construct()
{
global $d;
$d = new C; // How wrong is it to replace the value of $d from inside B, like this?
exit();
}
}
class C extends A
{
public function __construct()
{
echo 'C';
}
}

$d = new B;

Выход: C

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

Или (поскольку этот простой код выполняется без ошибок), допустим ли этот код, но он считается плохой практикой?

-2

Решение

Если вы ожидаете, что переменная $d будет содержать экземпляр класса C, вы бы ошиблись.
Чтобы узнать, удалите exit() и свалить $d в конце вашего кода с print_r() или же var_dump(),

// your code here without the exit()
echo "\n";
print_r($d);

Вот весь вывод:

C
B Object
(
)

Это сюрприз?
На самом деле, это не должно быть.

Изменение $d внутри конструктора класса B бессмысленно, потому что когда конструктор возвращается,
какое бы значение в $d будет перезаписан новым экземпляром класса B.

В этом нет ничего неопределенного.
Просто бессмысленно, потому что ничего не добивается.

-1

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

Да.

Это неправильно на нескольких уровнях.

  • вы не должны использовать глобальное состояние где-либо в ваших классах (которое относится как к глобальным переменным, так и к синглетонам / реестрам).
  • Вы не должны отображаться внутри метода класса и особенно не внутри конструктора
  • ты не должен звонить exit разве что в контексте «отладки бедняков».
  • Вы не должны создавать новый экземпляр другого класса внутри конструктора, потому что его становится очень сложно тестировать и отлаживать
  • Вы не должны злоупотреблять extends ключевое слово, потому что оно предназначено для создания специализированных подтипов базового класса
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector