Из имени строки класса я могу получить статическую переменную?

учитывая string имя класса в PHP, как я могу получить доступ к одной из его статических переменных?

что я хотел бы сделать это:

$className = 'SomeClass'; // assume string was actually handed in as a parameter
$foo = $className::$someStaticVar;

...но PHP дает мне прекрасную "ошибку синтаксического анализа: синтаксическая ошибка, неожиданная T_PAAMAYIM_NEKUDOTAYIM", которая, по-видимому, является еврейским именем для двойного двоеточия(::).

Update: к сожалению, я должен использовать PHP 5.2.X для этого.

Update 2: Как предположил MrXexxed, статическая переменная наследуется от родителя класс.

4 ответов


отражение сделает это

коллега просто показал мне, как это сделать с reflection, который работает с 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


какую версию PHP вы используете? Я считаю, что выше 5.3.x это разрешено, но до этого это не так.

EDIT: здесь вы идете с PHP 5.3.0 это разрешено Пример #2

echo $classname::doubleColon(); // As of PHP 5.3.0

изменить: Для переменных используйте

echo $classname::$variable; // PHP 5.3.0 +

здесь ссылке

редактировать 3: Попробуй!--13-->этой ссылке ответ оттуда, похоже, будет применяться к вашей ситуации.


это возможно только в PHP 5.3 и выше с позднего статического связывания.

обходной путь для старых версий PHP, который сначала приходит мне на ум, - пожалуйста, не навреди мне - используя eval():

if (class_exists($className))
{
    eval('$foo = ' . $className . '::$someStaticVar;');
}

кстати, при доступе к статическим переменным,$ перед именем переменной, так как в $someStaticVar.


возможно, вам придется использовать классы отражения. http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php

или используйте простую строку eval:print "{$className::$someStaticVar}", который заменяет $className перед поиском:: $someStaticVar. Не уверен в PHP