具有意外行为的PHP Magic方法

时间:2014-09-19 14:27:19

标签: php

<?php

class MyClass{

    private $props;

    public function __constructor(){
        $this->props = array();
    }

    public function __get($field) {
        return $this->props[$field];
    }

    public function __set($field, $value) {
        $this->props[$field] = $value;
    }
}


$myInstance = new MyClass();
$myInstance->a = "Some string";

echo "Property 'a' has value ",$myInstance->a,"<br />"; // First echo
echo "Is property 'a' empty? ",(empty($myInstance->a) ? "Yes, but it shouldn't!" : "No, as expected"); // Second echo
// Output:
// Property 'a' has value Some string
// Is property 'a' empty? Yes, but it shouldn't!


$temp = $myInstance->a;
echo 'Variable $temp has value ',$temp,"<br />";
echo 'Is variable $temp empty? ',(empty($temp) ? "Yes, but it shouldn't!" : "No, as expected");
// Output:
// Variable $temp has value Some string
// Is variable $temp empty? No, as expected

?>

我已经制作了这个小班级和代码来说明我的问题究竟是什么。

如您所见,我的班级有一个名为$ props的属性。此属性将是包含所有其他属性的数组。 我的数组$ props将使用Magic Method __set填充,此类的实例在不存在的属性(http://php.net/manual/en/language.oop5.magic.php)上有一个归因。

这部分工作正常。

当我想读取不存在的属性时,PHP应调用MyClass的__get方法并返回存储在$ props属性中的值。 它在第一个echo中正常工作(正确返回值)。 但是,如果我在将其返回到一个empty()函数时使用此读取操作,它总是返回TRUE,因为您可以在第二个echo的返回中看到(换句话说,php似乎无法正确读取$ props属性) )

如果我将属性的值存储在$ temp变量中并使用此变量,我的问题就解决了,但我不想只解决这个问题。我想了解这里发生了什么。

它是魔术方法的PHP错误吗? 这是一个空洞的错误吗? 我的代码做了什么毫无意义的事吗? (最可能的答案)

在你问之前:我在Windows机器上运行我的php服务器,我的php版本是5.3.8

提前致谢。

1 个答案:

答案 0 :(得分:1)

因为empty检查变量是否存在,然后是否为空。如果它不存在(在你的情况下,因为你没有传递一个变量),那么它返回true

查看文档页面:http://php.net/manual/en/function.empty.php