我需要一個方法來確認在類別外部存取屬性是否可行,且不會產生錯誤/警告,同時要考慮到該類別可能會使用魔術方法 __isset/__get 來模擬不存在的屬性。
<?php
function public_property_exists( $obj, $prop ){
if( isset( $obj->$prop )) return true;
if( ! property_exists( $obj, $prop )) return false;
$rp = new ReflectionProperty( $obj, $prop );
return $rp->isPublic();
}
class C {
public $public = "我是公開的!";
protected $protected = "我是保護的!";
private $private = "我是私有的!";
function __isset( $k ){
return substr( $k, 0, 5 ) === 'magic';
}
function __get( $k ){
if( $k === 'magic_isset_but_null') return null;
return "我是 {$k}!";
}
}
$o = new C();
foreach( array(
'public', 'protected', 'private',
'magic', 'magic_isset_but_null',
'missing'
) as $prop ){
if( public_property_exists( $o, $prop ))
echo "\$o->{$prop} 是一個公開屬性,其值為:",
var_export( $o->$prop, true ), "\n";
else echo "\$o->{$prop} 不是一個公開屬性。\n";
}