Php isset()会触发吗?为什么?

Php isset()会触发吗?为什么?,php,isset,Php,Isset,答案似乎是否定的,但为什么?只有当您尝试访问不存在的属性时,才会调用神奇函数\uuu get。检查属性是否存在与检索属性不同。,因为它使用get检查而不是检索属性 调用isset是一个更好的选择,因为没有关于什么是空的标准。在类的上下文中,null可能是一个可接受的值。您还可以有一个类,如果该成员不存在,它将返回一个新的空对象,这将破坏isset($myObj->item),因为在这种情况下,它将始终返回true。否,当您试图确定是否设置了属性时,不应触发\u get:测试属性是否设置与尝试获取

答案似乎是否定的,但为什么?

只有当您尝试访问不存在的属性时,才会调用神奇函数\uuu get。检查属性是否存在与检索属性不同。

,因为它使用get检查而不是检索属性


调用isset是一个更好的选择,因为没有关于什么是空的标准。在类的上下文中,null可能是一个可接受的值。您还可以有一个类,如果该成员不存在,它将返回一个新的空对象,这将破坏isset($myObj->item),因为在这种情况下,它将始终返回true。

否,当您试图确定是否设置了属性时,不应触发
\u get
:测试属性是否设置与尝试获取其值不同

使用
isset
触发
\uu isset
魔术方法

见:


    • 事实并非如此;您可以改用_uisset。这一点已经说明了。

      在我的示例中,似乎我没有定义“isset”?似乎你确实没有——但是,如果你已经定义了它,它应该被调用;;无论定义与否,都不会改变在测试是否设置了属性时未调用
      \uu get
      的任何情况。
      class a {
         function __get($property){...}
      }
      
      $obj = new a();
      var_dump(isset($obj->newproperty));
      
      Class A{
         public function __get($key){
            ...
         }
         public function __set($key,$name){
            ...
         }
         public function __unset($key){
            ...
         }
         public function __isset($key){
            ...
         }
      }
      $obj = new A();
      $get = $obj->newproperty;//$obj->__get("newproperty")
      $obj->newproperty = "X";//$obj->__set("newproperty","X")
      $bool = isset($obj->newproperty);//$obj->__isset("newproperty")
      unset($obj->newproperty);//$obj->__unset("newproperty")