5

谁能说出下面给定的行是什么意思?

下面的行是从PHP 手册中复制的:

笔记:

除了 isset() 之外,不能在其他语言结构中使用重载属性。这意味着如果对重载属性调用 empty(),则不会调用重载方法。

要解决该限制,必须将重载的属性复制到范围内的局部变量中,然后交给 empty()。

但是,我们不能在重载属性上调用 empty() 是不正确的,当我调用 empty() 时,它触发了 __isset()

4

3 回答 3

5

这是一个文档错误:

<?php
class PropNameReturn {
    function __isset($propname){
          return true;

    }
    function __get($propname){
          echo 'Yes, it IS called!'.PHP_EOL;
          return $propname;
    }
}
$o = new PropNameReturn();
var_dump(empty($o->this_prop_name));
//Yes, it IS called!
//bool(false)
$b = new stdClass();
var_dump(empty($b->this_prop_name));
//bool(true)
于 2012-06-16T13:17:16.127 回答
4

看来说明书有误。这也适用于 PHP 5.2

顺便说一句,似乎__get()在使用时被调用empty(),但结果也取决于__isset().

empty()仅当__isset()返回 true __get()返回空值时才返回 true。

请参阅此示例代码:

class Foo {
    function __get($name) {
        if ($name == "bar")
            return '';
    }
    function __isset($name) {
        if ($name == "bar")
            return true;
    }
}
$foo = new Foo();
echo $foo->bar . PHP_EOL;  // outputs "" - correct
echo var_export(isset($foo->bar)) . PHP_EOL; // outputs "true" - correct

$bar = $foo->bar;

// outputs both "true" -- so the manual is wrong here
echo var_export(empty($foo->bar)) . PHP_EOL;
echo var_export(empty($bar)) . PHP_EOL;

另请参阅此错误报告

于 2012-06-16T13:15:36.750 回答
0

显然我没有注意到您在自己的问题中包含的链接,所以这里是重载的基本分类:

PHP 中的重载是动态创建方法和参数的概念。考虑一个基本场景:

class MyClass {
  public $foo = 'bar';
}

$Instance = new MyClass();
echo $Instance->foo;

我们都希望打印“bar”,它会。这是使用重载的相同示例:

class MyOverloadedClass {
  public function __get($variable) {
    return $variable == 'foo' ? 'bar' : '';
  }
}

 $Instance = new MyOverloadedClass();
 echo $Instance->foo;

在第二个示例中,因为 MyOverloadedClass::$foo 不存在,__ge 方法将被执行,并将传递用户请求的变量(在本例中为“foo”)。我在 __get 方法中的代码将确定用户正在寻找 foo,并返回“bar”

语言结构是 PHP 语言的一部分。换句话说,解析器解释它们并知道要做什么,而不必查找函数引用。一些例子是 exit、die、print、echo、isset 和 empty。

isset() 是唯一可以处理重载的语言结构。手册页描述了一个重载方法 __isset,您可以将其添加到您的类中,并且每次有人在该类的属性上调用 isset 时都会执行该方法。然而,对重载的属性调用 empty() 将始终返回 true,并且可能会抛出 E_NOTICE。原因如下:

免责声明:在重载属性上调用 empty() 似乎会执行 __get(),如果且仅当您有一个为传递的变量名返回 true 的 __isset() 方法时:

empty() 不会调用您重载的 __get() 方法。它将查看类定义以查看该参数是否存在。如果是,它将评估它是否为空。但是,访问未定义的类参数会引发错误。在我的第一个示例中,我会通过询问 $Instance->bar 来引发错误,因为它不存在。如果您要求,这与您将得到的错误相同

empty( $Instance->foo );

在第二个例子中。我希望这有帮助。

有关如何将其应用于函数或设置变量的更多详细信息,请参阅您提到的页面。

于 2012-06-16T13:09:28.937 回答