2011-02-20 4 views
14

Я пытаюсь получить доступ к статическому методу, но используя переменную в качестве имени класса. Это возможно? Кажется, у меня проблемы с этим. Я хочу быть в состоянии сделать что-то вроде этого:Доступ к статическим методам с использованием имени класса переменной (PHP)

class foo { 
    public static function bar() { 
     echo 'test'; 
    } 
} 

$variable_class_name = 'foo'; 
$variable_class_name::bar(); 

И я хочу, чтобы быть в состоянии сделать то же с использованием статических переменных, а также.

+1

это работает штраф для меня на php 5.3.2. –

+0

используя 5.2, я считаю. получите ошибку, например: «Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_PAAMAYIM_NEKUDOTAYIM в /some/path/application/models/lev_base_model.php в строке 35» – dqhendricks

+0

Какую версию PHP вы используете? Насколько мне известно, вы смогли сделать это в последних версиях (5.2+, хотя и не совсем точно, когда это будет актуально) – GordonM

ответ

17

Этот синтаксис поддерживается только в PHP 5.3 и более поздних версиях. Предыдущие версии не понимают этот синтаксис, поэтому ваша ошибка синтаксического анализа (T_PAAMAYIM_NEKUDOTAYIM относится к оператору ::).

В предыдущих версиях вы можете попробовать call_user_func(), передавая ей массив, содержащий имя класса и его имя метода:

$variable_class_name = 'foo'; 
call_user_func(array($variable_class_name, 'bar')); 
+0

... так есть ли решение? – dqhendricks

+0

@dqhendricks: см. Мое редактирование – BoltClock

+0

выглядит великолепно. Есть ли что-то подобное для статических свойств? – dqhendricks

7

Вы можете использовать reflection для PHP 5.1 и выше:

class foo { 
    public static $bar = 'foobar'; 
} 

$class = 'foo'; 
$reflector = new ReflectionClass($class); 
echo $reflector->getStaticPropertyValue('bar'); 

> foobar 
+0

+1 Приятно, я бы забыл об отражении. – BoltClock

Смежные вопросы