10
class a {
   function __get($property){...}
}

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

Seems the answer is nope but why?

Michael Robinson
  • 29,278
  • 12
  • 104
  • 130
ORM
  • 465
  • 1
  • 4
  • 8

5 Answers5

19

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.

Yacoby
  • 54,544
  • 15
  • 116
  • 120
2

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

andrewffff
  • 579
  • 2
  • 6
1

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 :

Pascal MARTIN
  • 395,085
  • 80
  • 655
  • 663
  • Seems I didn't define __isset in my example? – ORM Feb 21 '10 at 18:55
  • Seems you didn't, indeed -- but, if you had defined it, it should have been called ;; and defining it or not doesn't change anything about `__get` not being called when you're testing if a property is set. – Pascal MARTIN Feb 21 '10 at 18:56
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

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.

David Snabel-Caunt
  • 57,804
  • 13
  • 114
  • 132