PHP: как использовать функцию класса в качестве обратного вызова [дубликат]
этот вопрос уже есть ответ здесь:
- Как динамически вызвать метод класса в PHP? 8 ответов
у меня есть класс с методами, которые я хочу использовать в качестве обратных вызовов. Как передать их в качестве аргументов?
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
не доступно)
3 ответа:
Регистрация
callable
руководство чтобы увидеть все различные способы передачи функции в качестве обратного вызова. Я скопировал это руководство здесь и добавил несколько примеров каждого подхода, основанного на вашем сценарии.вызвать
- A функции PHP передается по имени в виде строки. Можно использовать любую встроенную или пользовательскую функцию, за исключением языковых конструкций, таких как: array (), Эхо,пустая(),eval (), exit (),isset (),list (),print или unset ().
// Not applicable in your scenario $this->processSomething('some_global_php_function');
- A метод экземпляра объекта передается как массив, содержащий объект по индексу 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']);
- статические методы класса также можно передать без создания экземпляра объекта этого класса, передав имя класса вместо объекта в index 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+
- помимо общей пользовательской функции,анонимные функции также может быть передан в параметре callback.
// Not applicable in your scenario unless you modify the structure $this->processSomething(function() { // process something directly here... });