谁能说出下面给定的行是什么意思?
下面的行是从PHP 手册中复制的:
笔记:
除了 isset() 之外,不能在其他语言结构中使用重载属性。这意味着如果对重载属性调用 empty(),则不会调用重载方法。
要解决该限制,必须将重载的属性复制到范围内的局部变量中,然后交给 empty()。
但是,我们不能在重载属性上调用 empty() 是不正确的,当我调用 empty() 时,它触发了 __isset()
这是一个文档错误:
<?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)
看来说明书有误。这也适用于 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;
另请参阅此错误报告
显然我没有注意到您在自己的问题中包含的链接,所以这里是重载的基本分类:
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 );
在第二个例子中。我希望这有帮助。
有关如何将其应用于函数或设置变量的更多详细信息,请参阅您提到的页面。