请注意,__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