Учитывая имя строки класса в 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.