web-dev-qa-db-fra.com

PHP: Comment utiliser une fonction de classe en tant que rappel

J'ai une classe avec des méthodes que je veux utiliser comme callback. Comment les passer comme arguments?

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...
    }   

}

PD: Comment faire la même chose mais à partir de la méthode static (quand $this n'est pas disponible)

74
SmxCde

Consultez le callable manual pour voir toutes les façons de transmettre une fonction en tant que rappel. J'ai copié ce manuel ici et ajouté quelques exemples de chaque approche en fonction de votre scénario.

Appelable


  • Une fonction PHP est transmise par son nom sous forme de chaîne. Toute fonction intégrée ou définie par l'utilisateur peut être utilisée, à l'exception des constructions de langage telles que: array () , echo , empty () , eval () , exit () , isset () , list () , print ou unset () .
  // Not applicable in your scenario
  $this->processSomething('some_global_php_function');

  • Une méthode d'un objet instancié est transmise sous forme de tableau contenant un objet à l'index 0 et la méthode nom à l'index 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']);

  • Les méthodes de classe statique peuvent également être passées sans instancier un objet de cette classe en passant le nom de la classe à la place d'un objet à l'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+

  • Outre les fonctions communes définies par l'utilisateur, des fonctions anonymes peuvent également être transmises à un paramètre de rappel.
  // Not applicable in your scenario unless you modify the structure
  $this->processSomething(function() {
      // process something directly here...
  });

104
MikO

Comme il existe une manière plus élégante d’écrire le 5.3, j’essaie toujours de savoir s’il peut être réduit davantage.

$this->processSomething(function() {
    $this->myCallback();
});
9
Bankzilla

Vous pouvez également utiliser call_user_func () pour spécifier un rappel:

public function myMethod() {

    call_user_func(array($this, 'myCallback'));
}

private function myCallback() {
    // do something...
}
6
Geovani Santos