从类的字符串名称,我可以得到一个静态变量?

时间:2010-07-28 15:41:28

标签: php static

给定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猜测的那样,静态变量是从父类继承的。

4 个答案:

答案 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.phphttp://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虽然。