给定PHP中类的字符串名称,如何访问其中一个静态变量?
我想做的是:
$className = 'SomeClass'; // assume string was actually handed in as a parameter
$foo = $className::$someStaticVar;
...但PHP给了我一个可爱的“解析错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM”,这显然是双冒号(::)的希伯来名称。
更新:不幸的是,我必须使用PHP 5.2.X。
更新2:正如MrXexxed猜测的那样,静态变量是从父类继承的。
答案 0 :(得分:15)
一位同事刚刚向我展示了如何使用反射来实现这一点,它适用于PHP 5(我们在5.2),所以我想我会解释。
$className = 'SomeClass';
$SomeStaticProperty = new ReflectionProperty($className, 'propertyName');
echo $SomeStaticProperty->getValue();
请参阅http://www.php.net/manual/en/class.reflectionproperty.php
类似的技巧适用于方法。
$Fetch_by_id = new ReflectionMethod($someDbmodel,'fetch_by_id');
$DBObject = $Fetch_by_id->invoke(NULL,$id);
// Now you can work with the returned object
echo $DBObject->Property1;
$DBObject->Property2 = 'foo';
$DBObject->save();
请参阅http://php.net/manual/en/class.reflectionmethod.php和http://www.php.net/manual/en/reflectionmethod.invoke.php
答案 1 :(得分:7)
您运行的是哪个版本的PHP?我相信在5.3.x以上这是允许的,但在此之前它不是。
编辑:在这里你可以使用PHP 5.3.0 示例#2
echo $classname::doubleColon(); // As of PHP 5.3.0
编辑: 对于变量使用
echo $classname::$variable; // PHP 5.3.0 +
这是link
编辑3: 尝试this link从那里得到的答案似乎适用于您的情况。
答案 2 :(得分:1)
这只能在PHP 5.3及更高版本中使用late static bindings。
首先出现在我脑海中的旧版PHP的解决方法是 - 请不要伤害我 - 使用eval()
:
if (class_exists($className))
{
eval('$foo = ' . $className . '::$someStaticVar;');
}
顺便说一句,在访问静态变量时,需要变量名前的$
,如$someStaticVar
。
答案 3 :(得分:1)
您可能必须使用反射类。 http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php
或者使用一个简单的字符串eval:print "{$className::$someStaticVar}"
,在查找:: $ someStaticVar之前替换$ className。不确定PHP< 5.2虽然。