Я использую php 5.2.6. У меня есть шаблон стратегии, и стратегии имеют статический метод. В классе, который фактически реализует одну из стратегий, он получает имя класса стратегии для создания экземпляра. Тем не менее, я хотел вызвать один из статических методов до создания экземпляра, например:
$strNameOfStrategyClass::staticMethod();
но он дает T_PAAMAYIM_NEKUDOTAYIM
.
$> cat test.php <? interface strategyInterface { public function execute(); public function getLog(); public static function getFormatString(); } class strategyA implements strategyInterface { public function execute() {} public function getLog() {} public static function getFormatString() {} } class strategyB implements strategyInterface { public function execute() {} public function getLog() {} public static function getFormatString() {} } class implementation { public function __construct( strategyInterface $strategy ) { $strFormat = $strategy::getFormatString(); } } $objImplementation = & new implementation("strategyB") ; $> php test.php Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/test.php on line 24 $> php -v PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug 4 2010 03:25:57)
Будет ли это работать в 5.3?
Да. Этот синтаксис был введен в 5.3
Чтобы обходной путь для <= 5.2, вы можете использовать call_user_func
:
call_user_func(array($className, $funcName), $arg1, $arg2, $arg3);
или call_user_func_array
:
call_user_func_array(array($className, $funcName), array($arg1, $arg2, $arg3));
Но на другой ноте, что вы пытаетесь сделать, на самом деле не имеет смысла …
Почему это статическая функция? Ваш конструктор в implementation
ожидает объект в любом случае (это то, что ищет strategyInterface $strategy
$$$). Передача строки не будет работать, поскольку строки не реализуют интерфейсы. Итак, что бы я сделал, это сделать интерфейс нестатичным, а затем сделать что-то вроде:
$strategy = new StrategyB(); $implementation = new Implementation($strategy);
Затем в конструкторе:
$strFormat = $strategy->getFormatString();
Или, если вы действительно хотите, чтобы этот метод был статическим, вы могли бы сделать:
$strFormat = call_user_func(array(get_class($strategy), 'getFormatString'));
О, и = & new
синаксия устарела (и не делает то, что, как вы думаете, все равно).
Тип подсказки даст вам некоторые проблемы:
Аргумент 1 передан в реализацию :: __ construct () должен реализовать стратегию интерфейсаInterface, указанную строку