如何在运行时正确取消设置 PHP 中的类属性?

Posted

技术标签:

【中文标题】如何在运行时正确取消设置 PHP 中的类属性?【英文标题】:How to properly unset a class property in PHP during runtime? 【发布时间】: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 => 警告

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

【问题讨论】:

【参考方案1】:

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

查看差异:Demo

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

【讨论】:

是的,问题是 property_exists 返回 TRUE 而直接访问返回警告,这是自相矛盾的。一种解决方案是采用不同的方法,另一种方法是,我刚刚发现关于您的示例,不在类中定义属性,而是在运行时创建它,它的行为符合预期。 如果你想扩展你的答案,说如果属性是在对象构造之后根据你的演示中的 #1 示例定义的,则可以实现。谢谢

以上是关于如何在运行时正确取消设置 PHP 中的类属性?的主要内容,如果未能解决你的问题,请参考以下文章

php中如何找到对象所属的类?

如何在php中取消设置xml元素?

如何取消设置“beforeSave”云函数中的嵌套属性?

如何在注销时取消设置特定的 php 会话

当值为空时如何取消设置属性?

如何正确命名包含返回从此类中设置的源中选择的值并以相同方式设置源值的属性的类?