Intereting Posts
php 301 перенаправляет фактическое выполнение перенаправления 302 PHP-цикл через несколько массивов Запустить XDebug в Netbeans по внешнему запросу Удалите поле проверки, если товары корзины относятся к определенным категориям товаров Предупреждение: mysql_query () ожидает, что параметр 1 будет строкой, Yii2. Добавление динамического атрибута и правила к модели Что означает восклицательный знак перед тем, как функция на самом деле означает PHP? Как выполнить запрос / найти CACHE с помощью PAGINATION CakePhp 2.x? Pass Base64 jpeg image to og: image Завершите мои URL с завершающим косой чертой (/) или нет? И как мне это сделать с помощью codeigniter Подавить фиктивный PHP imap_open () Примечание: небезопасный сервер рекламируется AUTH = PLAIN PHP – косвенная модификация перегруженного имущества Исключение PHP PDO: не удалось найти драйвер Facebook SDK Upgrade to OAuth – PHP и Javascript Позвольте пользователю загрузить XML-файл

Нельзя вызвать статический метод из класса как имя переменной?

Я использую 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, указанную строку