PHP: jak używać funkcji klasy jako wywołania zwrotnego [duplikat]

To pytanie ma już odpowiedź tutaj:

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)

Author: SmxCde, 2015-03-10

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

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

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