我需要一种方法来确定在类外部访问属性是否可能不会出现错误/警告,考虑到该类可能会使用魔术方法 __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";
}