Как правильно отменить свойство класса в PHP во время выполнения?

#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 в вашей демонстрации. Спасибо