Отражение PHP — это полностью сконструированный объект

#php #reflection

#php #отражение

Вопрос:

Метод newInstanceWithoutConstructor (класс отражения — новый экземпляр без конструктора) может использоваться для создания экземпляра объекта без вызова его конструктора.

Есть ли какой-либо способ определить, имело ли это место?

например

 $obj = new MyClass('B', 'C');
$reflect = new ReflectionClass('MyObj')
$obj2= $reflect->newInstanceWithoutConstructor();
  

Есть ли какой-либо способ определить, что $obj полностью сконструировано, а $obj2 что нет?

Ответ №1:

Только если вы реализуете что-то в MyClass, чтобы проверить это:

 class MyClass {
  public $constructorCalled = false;

  public function __construct() {
    $this->constructorCalled = true;
  }
}
  

Комментарии:

1. $constructorCalled должно быть закрытым. И даже тогда можно использовать отражение, чтобы «обмануть» его.

2. Поскольку обман всегда будет работать, я выбрал самое простое решение, чтобы показать идею. Улучшения в этом зависят от OP

3. Я надеялся, что это можно использовать в любом классе, включая внутренние. Проблема в том, что нет способа определить, можно ли использовать newInstanceWithoutConstructor() для данного класса или нет (он не работает для внутренних классов или классов, расширяющих внутренние классы) -> isInternal() возвращает false для классов, которые расширяют внутренние классы, но newInstanceWithoutConstructor нельзя использовать для них

4. @Tom Это совершенно другая проблема, как описано в вашем вопросе. getParentClass поможет вам в этом.