PHP - Контекст создания объекта - Странное поведение - Это ошибка PHP?

Я не задаю типичный вопрос о том, почему какой-то код дал сбой, но я спрашиваю, почему он работал. Он работал со мной во время кодирования, и мне нужно было, чтобы он потерпел неудачу.

Случай

  • базовый абстрактный класс с защищенным конструктором, объявленным абстрактным
  • родительский класс расширяет абстрактный класс с помощью общедоступного конструктора (Переопределение)
  • дочерний класс расширяет тот же самый абстрактный класс с защищенным конструктором

      абстрактный класс BaseClass {
    абстрактная защищенная функция __construct ();
     }
    
    class ChildClass extends BaseClass {
    защищенная функция __construct () {
    echo "Это работает";
     }
     }
    
    class ParentClass extends BaseClass {
    публичная функция __construct () {
    новый ChildClass ();
     }
     }
    
     // $ obj = new ChildClass (); // Приведет к фатальной ошибке. Ожидал!
    
     $ obj = новый родительский класс (); // это работает !! ПОЧЕМУ?
    

Question

Родительский класс создает объект дочернего класса, и это работает !! как это происходит? Насколько мне известно, объект не может быть создан, если его конструктор объявлен защищенным, за исключением случаев, когда он является внутренним или внутри каких-либо подклассов путем наследования.

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

РЕДАКТИРОВАТЬ

] Этот случай происходит только с абстрактным базовым классом, который также имеет абстрактный конструктор. Если базовый класс Concerete или его защищенный конструктор не является абстрактным, создание экземпляра завершается неудачно, как и ожидалось ... это ошибка PHP? Для моего рассудка мне действительно нужно объяснение, почему PHP ведет себя именно так в этом очень конкретном случае.

Заранее спасибо

6
задан Ahmad Farouk 24 February 2012 в 07:55
поделиться