Могу ли я получить статическую переменную из строкового имени класса? - PullRequest
9 голосов
/ 28 июля 2010

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

Что я хотел бы сделать так:

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

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

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

Обновление 2: Как и предполагал MrXexxed, статическая переменная наследуется от родительского класса.

Ответы [ 4 ]

15 голосов
/ 29 июля 2010

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

Сотрудник только что показал мне, как сделать это с помощью отражения, которое работает с 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

7 голосов
/ 28 июля 2010

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

РЕДАКТИРОВАТЬ: здесь, начиная с PHP 5.3.0, это разрешено.Для переменных используйте

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

вот ссылку

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

1 голос
/ 28 июля 2010

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

Или используйте простую строку eval: print "{$className::$someStaticVar}", которая заменяет $ className перед поиском :: $ someStaticVar. Не уверен насчет PHP <5.2, хотя. </p>

1 голос
/ 28 июля 2010

Это возможно только в PHP 5.3 и более поздних версиях с поздними статическими привязками .

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...