Из имени строки класса я могу получить статическую переменную?
учитывая 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