PHP: jak używać funkcji klasy jako wywołania zwrotnego [duplikat]
To pytanie ma już odpowiedź tutaj:
- jak dynamicznie wywołać metodę klasy w PHP? 8 odpowiedzi
Mam klasę z metodami, które chcę wykorzystać jako wywołania zwrotne. Jak przekazać je jako argumenty?
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: Jak zrobić to samo, ale z metody static
(gdy $this
nie jest dostępna)
51
3 answers
Sprawdź callable
manual , aby zobaczyć wszystkie różne sposoby przekazywania funkcji jako wywołania zwrotnego. Skopiowałem tę instrukcję tutaj i dodałem kilka przykładów każdego podejścia na podstawie Twojego scenariusza.
Callable
- A funkcja PHP jest przekazywana przez swoją nazwę jako łańcuch znaków. Można użyć dowolnej wbudowanej lub zdefiniowanej przez użytkownika funkcji, z wyjątkiem konstrukcji językowych, takich jak: array(), echo, pusty(), eval () , exit(), isset(), lista(), print lub unset () .
// Not applicable in your scenario
$this->processSomething('some_global_php_function');
- A metoda instancji obiektu {[18] } jest przekazywana jako tablica zawierająca obiekt w indeksie 0 oraz nazwę metody w indeksie 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']);
- statyczne metody klasy mogą być również przekazywane bez tworzenia instancji obiektu tej klasy, przekazując klasę nazwa zamiast obiektu w indeksie 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+
- oprócz zwykłej funkcji zdefiniowanej przez użytkownika, funkcje anonimowe mogą być również przekazywane do parametru wywołania zwrotnego.
// Not applicable in your scenario unless you modify the structure
$this->processSomething(function() {
// process something directly here...
});
80
Author: MikO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-04 10:04:50
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-04 10:04:50
Ponieważ 5.3 jest bardziej elegancki sposób, aby to napisać, nadal staram się dowiedzieć, czy można go zmniejszyć bardziej
$this->processSomething(function() {
$this->myCallback();
});
7
Author: Bankzilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 00:49:49
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 00:49:49
Możesz również użyć call_user_func (), aby określić wywołanie zwrotne:
public function myMethod() {
call_user_func(array($this, 'myCallback'));
}
private function myCallback() {
// do something...
}
5
Author: Geovani Santos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 01:33:22
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 01:33:22