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

标签 php get set magic-methods

我是 php 世界的新手。我试图了解 __set() 魔术方法在 php 中的工作原理。这里我使用 __set() 创建一个新属性__set() em> 方法。我有一个 if 语句,用于检查该属性是否已存在。如果不存在,则它创建该属性并为其分配一个值。这里我正在检查两个属性。它们是$newProp$anotherProp . $newProp不存在。因此它创建该属性并两次回显其值。但是对于已经存在的 $anotherPropelse 条件没有触发。这里我面临两个问题

1.它两次回显属性值。

2.Else条件根本不起作用。我的意思是如果属性已经存在 存在它不会打印任何消息。

      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 documentation on "variable variables" ,您可以在其中找到可变对象属性的示例。

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 上调用时看不到属性已存在的原因是 __set() is called for inaccessible properties 。对于声明为 public 的属性,不会调用它。如果您改为声明

private $anotherProp = 'i am another property';

您将看到调用了__set()方法并打印了已经存在消息。

Here's the whole thing in action

关于php - __set() 方法回显属性值两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28126121/

相关文章:

php - 在另一个类的另一个文件中调用php类

ruby - 修复 416 错误 : HTTParty

java - 如何相交两组不适合内存的long?

c++ - std::set 中的函数和方法指针

php - 如何将主题名称从默认更改为 laravel 中的任何名称

php - Yii2 delete() 没有主键

curl查询参数获取

php - 转义并清理 $_GET 参数

javascript - 在nodejs中从集合/列表生成有序对

php - MYsql更新新用户问题