【问题标题】:How to properly unset a class property in PHP during runtime?如何在运行时正确取消设置 PHP 中的类属性?
【发布时间】:2019-09-01 01:30:59
【问题描述】:

我有一个类,它有一个我想在运行时取消设置/销毁的属性。取消设置发生在特定方法中,但调用它的方法在property_exists 中返回TRUE,而不能直接使用$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 => 警告

但是当属性未定义但在对象构造时创建时,则可以取消设置并按预期运行。

【问题讨论】:

    标签: php object runtime unset


    【解决方案1】:

    似乎从 PHP 5.3.0 开始,如果您将其定义为对象变量,那么即使在 unset 之后,property_exists 也会返回 true。请改用isset($this->isEmpty),因为这会在unset 之后返回false

    查看差异:Demo

    但是,您可能应该采取不同的方法,例如设置为 truefalsenull 或其他东西并检查它。

    【讨论】:

    • 是的,问题是 property_exists 返回 TRUE 而直接访问返回警告,这是自相矛盾的。一种解决方案是采用不同的方法,另一种方法是,我刚刚发现关于您的示例,不在类中定义属性,而是在运行时创建它,它的行为符合预期。
    • 如果你想扩展你的答案,说如果属性是在对象构造之后根据你的演示中的 #1 示例定义的,则可以实现。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2011-12-18
    • 2017-05-26
    • 2012-06-21
    • 1970-01-01
    • 2012-02-07
    • 2011-02-09
    相关资源
    最近更新 更多