Intereting Posts
Ассоциативный массив, значения суммы одного и того же ключа PHP – разница в месяцах DateTime, не учитывающая разницу в году передача параметров в xml Класс Paginator Как сделать динамические страницы seo friendly url, используя htaccess Как получить значение из функции javascript, которая использует ajax Weird PHP error: «Невозможно использовать возвращаемое значение функции в контексте записи» Анализ MySQL в JavaScript Массивы через PHP и jQuery Instant Messenger Онлайн-проверка состояния / индикатор для GTalk, MSN (Skype), Facetime (или сообщений) Извлечение данных из базы данных MySql с использованием html-формы и php с демонстрацией mysql – Вставка строки в таблицу 1, когда определенная строка удалена в таблице 2 Можно ли обновить Lifetime или Daily Statistics в magento с помощью cron? Показывать второе раскрывающееся меню, основанное на предыдущем выпадающем списке. Загрузка данных из базы данных с помощью php и чистого ajax в текстовое поле Пользовательский serialize_handler для настраиваемого php SessionHandler (хранилище БД)

Передача статических методов в качестве аргументов в PHP

В PHP можно сделать что-то вроде этого:

myFunction( MyClass::staticMethod ); 

так что «myFunction» будет ссылаться на статический метод и иметь возможность его вызвать. Когда я пытаюсь, я получаю сообщение об ошибке «Неопределенная константа класса» (PHP 5.3), поэтому, я думаю, это невозможно, но есть ли способ сделать что-то подобное? Самое близкое, что мне удалось до сих пор, это передать «функцию» в виде строки и использовать call_user_func ().

Solutions Collecting From Web of "Передача статических методов в качестве аргументов в PHP"

«PHP-путь» для этого – использовать тот же синтаксис, который используется is_callable и call_user_func .

Это означает, что ваш метод «нейтрален»

  • Название стандартной функции
  • Метод статического класса
  • Метод экземпляра
  • Закрытие

В случае статических методов это означает, что вы должны передать его как:

 myFunction( [ 'MyClass', 'staticMethod'] ); 

или если вы еще не используете PHP 5.4:

 myFunction( array( 'MyClass', 'staticMethod') ); 

Поскольку вы уже упоминали, что call_user_func() был использован, и вы не заинтересованы в решении с тем или теми, которые передают статическую функцию в виде строки, вот альтернатива: использование анонимных функций в качестве оболочки для статического функция.

 function myFunction( $method ) { $method(); } myFunction( function() { return MyClass::staticMethod(); } ); 

Я бы не рекомендовал это делать, поскольку, по-моему, метод call_user_func() более краток.

Если вы хотите избежать строк, вы можете использовать этот синтаксис:

 myFunction( function(){ return MyClass::staticMethod(); } ); 

Это немного подробный, но он имеет то преимущество, что его можно подвергнуть статическому анализу. Другими словами, IDE может легко указать ошибку в имени статической функции.

Позвольте мне попытаться привести подробный пример …

Вы бы позвонили так:

 myFunction('Namespace\\MyClass', 'staticMethod'); 

или как это (если у вас есть аргументы, которые вы хотите передать):

 myFunction('Namespace\\MyClass', 'staticMethod', array($arg1, $arg2, $arg3)); 

И ваша функция для получения этого вызова:

 public static function myFunction($class, $method, $args = array()) { if (is_callable($class, $method)) { return call_user_func_array(array($class, $method), $args); } else { throw new Exception('Undefined method - ' . $class . '::' . $method); } } 

Подобная техника обычно используется в шаблоне Decorator в php.

это покажет 6 для первого вызова и 9 для второго вызова на выходе.

 $staticmethod1 = function ($max) { return $max*2; }; $staticmethod2 = function ($max) { return $max*$max; }; function myfunction($x){ echo $x(3); } myfunction($staticmethod1); myfunction($staticmethod2); 

на вопрос:

В PHP можно сделать что-то вроде этого:

myFunction (MyClass :: staticMethod);

ответ – да. вы можете вместо staticMethod () вернуть анонимную функцию. т.е.

 private static function staticMethod() { return function($anyParameters) { //do something here what staticMethod() was supposed to do // ... // ... //return something what staticMethod() was supposed to return; }; } 

вы можете написать

 myFunction(MyClass::staticMethod()); 

но обратите внимание, что () требуется для вызова staticMethod (). Это связано с тем, что теперь она возвращает анонимную функцию, которая завершает работу того, что вы изначально хотели, чтобы ваш staticMethod () выполнял.

Это отлично работает, когда staticMethod () передается только как параметр в другую функцию. Если вы хотите вызвать staticMethod (), который непосредственно обрабатывает, вы должны тогда написать

 MyClass::staticMethod()($doPassInParameters); 

Обратите внимание, что для получения указателя функции может потребоваться один дополнительный избыточный шаг по сравнению с тем, когда он может работать, не обертывая его анонимной функцией. Я использую его только как параметр, поэтому не уверен в качестве дополнительного шага. Возможно, незначительно …