__set() 方法回显属性值两次


__set() method echoing property value twice

我是 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->proppublic属性,因为您不使用变量$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检查基本上无用(因为它总是在__setfalse)。