Will isset() trigger __get and why?

前端 未结 5 1751
面向向阳花
面向向阳花 2021-01-02 05:33
class a {
   function __get($property){...}
}

$obj = new a();
var_dump(isset($obj->newproperty));

Seems the answer is nope but why?

相关标签:
5条回答
  • 2021-01-02 06:06

    No, __get should not be triggered when you're trying to determine whether a property is set : testing if a property is set is not the same thing as trying to get its value.

    Using isset triggers the __isset magic method.

    See :

    • isset
    • and Overloading
    0 讨论(0)
  • 2021-01-02 06:08

    It just isn't; you can use __isset instead. This is laid out here.

    0 讨论(0)
  • 2021-01-02 06:10

    The magic function __get is only called when you try to access a property that doesn't exist. Checking whether a property exists is not the same as retrieving it.

    0 讨论(0)
  • 2021-01-02 06:16

    Because it checks __isset rather than retrieving it using __get.

    It is a much better option to call __isset, as there is no standard on what is empty. Maybe in the context of the class null is an acceptable value. You could also have a class that if the member didn't exist, it returned a new empty object, which would break isset($myObj->item) as in that case it would always return true.

    0 讨论(0)
  • 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")
    
    0 讨论(0)
提交回复
热议问题