请注意,在链式检查中不会调用 `__isset`。
如果执行 `isset( $x->a->b )`,其中 `$x` 是一个声明了 `__isset()` 方法的类,则不会调用 `__isset()` 方法。
<?php
class 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 ) ;
?>
输出
执行 `isset( $x->a )` 时,如预期的那样在 `demo` 上调用 `__isset()`
C:\htdocs\test.php:31 demo::__isset(a) instance demo
执行 `isset( $x->a->b )` 时,在 `demo` 上调用 `__get()` 而不调用 `__isset()`
C:\htdocs\test.php:26 demo::__get(a) instance demo
C:\htdocs\test.php:31 demo::__isset(b) instance autocreated