#php #object #runtime #unset
#php #объект #время выполнения #отменить
Вопрос:
У меня есть класс, у которого есть свойство, которое я хочу отменить / уничтожить во время выполнения. Отключение происходит в определенном методе, но вызывающий его метод возвращает TRUE
in property_exists
, хотя он не может напрямую обращаться к свойству, $this->property
поскольку возвращает уведомление Notice: Undefined property:...
public function get(int $id) {
if ($record->data) {
$this->_transform($record); // Calling method that unsets prop
}
if (! property_exists($this, 'isEmpty') ) { // FALSE
$this->transform();
}else{
echo $this->isEmpty; // FALSE as well!
}
return $this;
}
private method _transform(Record $record) {
unset($this->isEmpty); // Unsetting happens here
return;
}
Как вы можете видеть в коде после отмены, property_exists
возвращает TRUE, чего не должно быть, но свойство не определено.
Редактировать
Кажется, что если свойство объявлено в схеме класса, то его нельзя уничтожить / отменить (см. Демонстрацию выбранного ответа), и на самом деле оно ведет себя парадоксально: property_exists => TRUE, object-> property => warning
НО когда свойство не определено, а создано при создании объекта, его можно отключить и вести себя так, как ожидалось.
Ответ №1:
Начиная с PHP 5.3.0, кажется, что если вы определяете его как переменную объекта property_exists
, он возвращается true
даже после unset
. Используйте isset($this->isEmpty)
вместо этого, поскольку это возвращается false
после unset
.
Смотрите различия: Демонстрация
Однако вам, вероятно, следует использовать другой подход, например, установить значение true
или false
или null
или что-то еще и проверить это.
Комментарии:
1. Да, проблема в том, что property_exists возвращает TRUE, в то время как прямой доступ возвращает предупреждение, что парадоксально. Одним из решений было бы использовать другой подход, а другим, который я только что нашел в ваших примерах, было бы не определять свойство в классе, а скорее создавать его во время выполнения, где оно ведет себя так, как ожидалось.
2. если вы хотите расширить свой ответ, сказав, что это может быть достигнуто, если свойство определено после построения объекта в соответствии с вашим примером # 1 в вашей демонстрации. Спасибо