Note that __isset is not called on chained checks. If isset( $x->a->b ) is executed where $x is a class with __isset() declared, __isset() is not called.<?phpclass demo{ var $id ; function __construct( $id = 'who knows' ) { $this->id = $id ; } function __get( $prop ) { echo "\n", __FILE__, ':', __LINE__, ' ', __METHOD__, '(', $prop, ') instance ', $this->id ; return new demo( 'autocreated' ) ; } function __isset( $prop ) { echo "\n", __FILE__, ':', __LINE__, ' ', __METHOD__, '(', $prop, ') instance ', $this->id ; return FALSE ; }}$x = new demo( 'demo' ) ;echo "\n", 'Calls __isset() on demo as expected when executing isset( $x->a )' ;$ret = isset( $x->a ) ;echo "\n", 'Calls __get() on demo without call to __isset() when executing isset( $x->a->b )' ;$ret = isset( $x->a->b ) ;?>OutputsCalls __isset() on demo as expected when executing isset( $x->a )C:\htdocs\test.php:31 demo::__isset(a) instance demoCalls __get() on demo without call to __isset() when executing isset( $x->a->b )C:\htdocs\test.php:26 demo::__get(a) instance demoC:\htdocs\test.php:31 demo::__isset(b) instance autocreated