У меня есть класс с методами, которые я хочу использовать в качестве обратных вызовов. Как передать их в качестве аргументов?
Class MyClass { public function myMethod() { $this->processSomething(this->myCallback); // How it must be called ? $this->processSomething(self::myStaticCallback); // How it must be called ? } private function processSomething(callable $callback) { // process something... $callback(); } private function myCallback() { // do something... } private static function myStaticCallback() { // do something... } }
UPD: как сделать то же самое, но из static
метода (когда $this
не доступно)
Проверьте руководство по callable
чтобы просмотреть все способы передачи функции в качестве обратного вызова. Я скопировал это руководство здесь и добавил несколько примеров каждого подхода, основанного на вашем сценарии.
подлежащий выкупу
- Функция PHP передается по имени в виде строки. Любая встроенная или определяемая пользователем функция может использоваться, за исключением языковых конструкций, таких как: array () , echo , empty () , eval () , exit () , isset () , list () , print или unset () ,
// Not applicable in your scenario $this->processSomething('some_global_php_function');
- Метод объекта-объекта передается как массив, содержащий объект с индексом 0 и имя метода в индексе 1 .
// Only from inside the same class $this->processSomething([$this, 'myCallback']); $this->processSomething([$this, 'myStaticCallback']); // From either inside or outside the same class $myObject->processSomething([new MyClass(), 'myCallback']); $myObject->processSomething([new MyClass(), 'myStaticCallback']);
- Статические методы класса также могут передаваться без создания экземпляра объекта этого класса путем передачи имени класса вместо объекта с индексом 0 .
// Only from inside the same class $this->processSomething([__CLASS__, 'myStaticCallback']); // From either inside or outside the same class $myObject->processSomething(['\Namespace\MyClass', 'myStaticCallback']); $myObject->processSomething(['\Namespace\MyClass::myStaticCallback']); // PHP 5.2.3+ $myObject->processSomething([MyClass::class, 'myStaticCallback']); // PHP 5.5.0+
- Помимо общей пользовательской функции, анонимные функции также могут быть переданы параметру обратного вызова.
// Not applicable in your scenario unless you modify the structure $this->processSomething(function() { // process something directly here... });
Вы также можете использовать call_user_func () для указания обратного вызова:
public function myMethod() { call_user_func(array($this, 'myCallback')); } private function myCallback() { // do something... }
Начиная с версии 5.3 есть более элегантный способ, которым вы можете написать это, я все еще пытаюсь выяснить, можно ли его уменьшить
$this->processSomething(function() { $this->myCallback(); });