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

Учитывая имя строки класса в 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, статическая переменная наследуется от родительского класса.

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

Сотрудник просто показал мне, как это сделать с отражением, которое работает с 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: попробуйте эту ссылку, ответ оттуда кажется, что это применимо к вашей ситуации.

Это возможно только в 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 <5.2.