請注意,__isset 不會在鏈式檢查時呼叫。
如果執行 isset( $x->a->b ),其中 $x 是宣告了 __isset() 的類別,則不會呼叫 __isset()。
<?php
class demo
{
var $id ;
function __construct( $id = '誰知道' )
{
$this->id = $id ;
}
function __get( $prop )
{
echo "\n", __FILE__, ':', __LINE__, ' ', __METHOD__, '(', $prop, ') 實例 ', $this->id ;
return new demo( '自動建立' ) ; }
function __isset( $prop )
{
echo "\n", __FILE__, ':', __LINE__, ' ', __METHOD__, '(', $prop, ') 實例 ', $this->id ;
return FALSE ;
}
}
$x = new demo( '示範' ) ;
echo "\n", '執行 isset( $x->a ) 時,如預期呼叫示範的 __isset()' ;
$ret = isset( $x->a ) ;
echo "\n", '執行 isset( $x->a->b ) 時,在沒有呼叫 __isset() 的情況下呼叫示範的 __get()' ;
$ret = isset( $x->a->b ) ;
?>
輸出
執行 isset( $x->a ) 時,如預期呼叫示範的 __isset()
C:\htdocs\test.php:31 demo::__isset(a) 實例 示範
執行 isset( $x->a->b ) 時,在沒有呼叫 __isset() 的情況下呼叫示範的 __get()
C:\htdocs\test.php:26 demo::__get(a) 實例 示範
C:\htdocs\test.php:31 demo::__isset(b) 實例 自動建立