php中的重载

php中的重载,php,php-5.3,Php,Php 5.3,有人能说出下面给出的行是什么意思吗 下面的行是从中复制的: 注意: 不能在其他语言中使用重载属性 比isset()更简单。这意味着如果在 属性,则不会调用重载方法 要解决该限制,必须复制重载属性 放入范围中的局部变量,然后交给empty() 但我们不能对重载属性调用empty(),这不是真的,当我调用empty()时,它触发了u isset()显然我没有注意到您在自己的问题中包含的链接,因此这里是重载的基本分类: PHP中的重载是动态创建方法和参数的概念。考虑一个基本的场景: class MyC

有人能说出下面给出的行是什么意思吗

下面的行是从中复制的:

注意:

不能在其他语言中使用重载属性 比isset()更简单。这意味着如果在 属性,则不会调用重载方法

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


但我们不能对重载属性调用empty(),这不是真的,当我调用empty()时,它触发了u isset()

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

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不存在,因此将执行u_ge方法,并将传递用户请求的变量(在本例中为“foo”)。我在_get方法中的代码将确定用户正在查找foo,并返回“bar”

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

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

免责声明:在重载属性上调用empty()似乎确实执行了uu get(),当且仅当您有一个u isset()方法为传递的变量名返回true时:

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

empty( $Instance->foo );
在第二个例子中。我希望这有帮助


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

看起来手册是错误的。这也适用于PHP5.2

顺便说一下,当
empty()
使用时,似乎调用了
\uu get()
,但结果也取决于
\uu isset()

empty()

请参见以下示例代码:


另请参见此

这是一个文档错误:

<?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开发人员提供建议……谢谢……是的,取决于
\uuu-isset()
,请在@Kaii的答案中查看不同的结果。取决于
\uu-isset()
\uu-get()
的结果。。如果
\uu isset()
返回true,但
\uu get()
返回空输出,则
空($foo->bar)
计算结果为true。请参阅我编辑的答案。@Wrikken。。没错,我现在试过了。这部分的手册是错误的。当我们使用empty($foo->bar)时,会调用yes\uu get()。。我们称之为$foo->bar@PoonamBhatt但是,只有当有一个
\uu isset()
方法为假属性返回true时,我才会说查看:另请参见.Kaii,查看粗体文本,其中说:免责声明:在重载属性上调用empty()似乎执行u get(),如果且仅当您有一个u isset())方法,该方法为传递的变量名返回true。我的答案与其他答案一样正确。免责声明后的文本描述了当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)