我是 php 世界的新手。我试图了解 __set() 魔术方法在 php 中的工作原理。在这里,我使用 __set() 方法创建一个新属性。我有一个 if 语句来检查该属性是否已存在。如果不存在,则创建属性并为其赋值。在这里,我正在检查两个属性。他们$newProp和$anotherProp.$newProp不存在。因此,它创建属性并回显其值两次。但是对于已经存在的$anotherProp,else条件没有触发。在这里我面临两个问题
1.它回显属性值两次。
2.否则条件根本不起作用。我的意思是,如果财产已经 存在它不打印任何消息。
class myclass {
public $anotherProp='Another property value';
public function __set($prop,$val){
if(! property_exists($this,$prop) ){
$this->prop=$val;
echo $this->prop;
}else{
echo 'property already exists';
}
}
}
$obj=new myclass();
$obj->newProp='i am a new property';
$obj->anotherProp='i am another property';
在__set()
中,您意外地创建了另一个隐式称为$this->prop
的public
属性,因为您不使用变量$prop
来确定哪个属性获取其值集。随后的echo
发生了两次,因为那个尚未创建的属性称为__set()
。
使用$this->$prop
来解决其中的这一部分,并查看有关"变量变量"的PHP文档,您将在其中找到变量对象属性的示例。
public function __set($prop, $val) {
if (!property_exists($this, $prop)) {
// Set the property dynamically
$this->$prop = $val;
echo $this->$prop;
}
else {
echo 'property already exists';
}
}
现在,在$anotherProp
上调用它时看不到property already exists
的原因是__set()
是为无法访问的属性调用的。 声明public
的属性不需要它。如果您改为声明
private $anotherProp = 'i am another property';
您将看到调用的 __set()
方法并打印已存在的消息。
这是整个事情在行动
首先,你有一个错别字
$this->prop = $val;
应该是
$this->$prop = $val;
$this->prop
的意思是"这个属性,其名称是"prop"(=直接引用)。 $this->$prop
的意思是"其名称存储在$prop中的属性"(=间接引用)。
其次,__set
仅在未定义的属性上调用,因此
$obj->someExistingProp = ...
不叫__set
.这使得您的property_exists
检查基本上无用(因为它总是在__set
中false
)。