如何在运行时正确取消设置 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
但是,您可能应该采取不同的方法,例如设置为 true
或 false
或 null
或其他东西并检查它。
【讨论】:
是的,问题是 property_exists 返回 TRUE 而直接访问返回警告,这是自相矛盾的。一种解决方案是采用不同的方法,另一种方法是,我刚刚发现关于您的示例,不在类中定义属性,而是在运行时创建它,它的行为符合预期。 如果你想扩展你的答案,说如果属性是在对象构造之后根据你的演示中的 #1 示例定义的,则可以实现。谢谢以上是关于如何在运行时正确取消设置 PHP 中的类属性?的主要内容,如果未能解决你的问题,请参考以下文章