2010-01-17 5 views
3

У меня возникла проблема с использованием переменной в качестве имени класса при вызове статической функции внутри класса. Мой код выглядит следующим образом:PHP: имя переменной как экземпляр класса

class test { 
    static function getInstance() { 
     return new test(); 
    } 
} 

$className = "test"; 
$test = $className::getInstance(); 

Ive получил, чтобы определить имя класса переменной в качестве имени класса поступает из базы данных, так что я никогда не знаю, какой класс, чтобы создать экземпляр.

Примечание: В настоящее время я получаю следующее сообщение об ошибке:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM 

Благодаря

+0

Как ни странно, ваш код работает для меня в PHP 5.3.1 и не вызывает ошибку. –

+1

переменные статические классы доступны в PHP 5.3+, для чего-то ниже требуется call_user_func()/call_user_func_array(), как указано @hobodave – Owen

ответ

8
$test = call_user_func(array($className, 'getInstance')); 

См call_user_func и callbacks.

+0

Ударьте меня на удар. Это один (и только?) Правильный путь. –

+0

Только до 5.3, то есть в 5.3+ вы можете использовать переменные имена классов. – StasM

0

Вы можете использовать reflection API, что позволит вам сделать что-то вроде:

$className = 'Test'; 
$reflector = new ReflectionClass($className); 
$method = $reflector->getMethod('getInstance'); 
$instance = $method->invoke(null); 

или даже:

$className = 'Test'; 
$reflector = new ReflectionClass($className); 
$instance = $reflector->newInstance(); 
// or $instance = $reflector->newInstanceArgs([array]); 
// or $instance = $reflector->newInstanceWithoutConstructor(); 

И, кажется, намного чище меня, чем просто интерпретировать значение строки непосредственно как имя класса или используя call_user_func и друзей.

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