#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 поможет вам в этом.