示例:
class LOL{
const
FOO = 1;
}
$x = new LOL;
$arr = array('x' => $x);
echo $x::FOO; // works
echo $arr['x']::FOO; // works too
但是如果我将我的类实例作为属性,我就不能再访问常量了:
class WWW{
protected $lol;
public function __construct($lol){
$this->lol= $lol;
}
public function doSMth(){
echo $this->lol::FOO; // fail. parse error.. wtf
}
}
$w = new WWW;
$w->doSMth();
:(
我知道我可以做echo LOL::FOO
,但如果班级名称未知会怎么样?从那个位置我只能访问该对象/属性,我真的不希望WWW类“了解”其他类及其名称。它应该只适用于给定的对象
答案 0 :(得分:2)
通过将lol
属性分配给局部变量,您可以更轻松地完成此操作,如下所示:
public function doSMth(){
$lol = $this->lol;
echo $lol::FOO;
}
这仍然很愚蠢,但可以防止使用反射。
答案 1 :(得分:1)
如果类名称未知,您可以使用ReflectionClass来获取常量。请注意,您必须使用PHP 5或更高版本。
示例:
$c = new ReflectionClass($this->lol);
echo $c->getConstant('FOO'); // 1
从PHP 5.3.0开始,您可以通过包含类名的变量访问常量:
$name = get_class($this->lol);
echo $name::FOO; // 1
有关详细信息,请参阅Scope Resolution Operator - PHP
答案 2 :(得分:0)
$lol = &$this->lol;
echo $lol::FOO;
..
unset($lol);