Le type PHP callable

C’est chatouilleux si on l’utilise pas exactement comme prévu !

Exemple, dans Clearbricks le code de l’URL handler est celui-ci, pour en enregistrer un nouveau :

    /**
     * Register an URL handler
     *
     * @param      string           $type            The URI type
     * @param      string           $url             The base URI
     * @param      string           $representation  The URI representation (regex, string)
     * @param      callable         $handler         The handler
     */
    public function register(string $type, string $url, string $representation, callable $handler): void
    {
        $this->types[$type] = [
            'url'            => $url,
            'representation' => $representation,
            'handler'        => $handler,
        ];
    }

Côté Dotclear on l’étend avec ce code :

    /**
     * Register an URL handler
     *
     * @param      string    $type            The type
     * @param      string    $url             The url
     * @param      string    $representation  The representation
     * @param      callable  $handler         The handler
     */
    public function register(string $type, string $url, string $representation, callable $handler): void
    {
        $t = new ArrayObject([$type, $url, $representation, $handler]);
        dcCore::app()->callBehavior('publicRegisterURL', $t);
        parent::register($t[0], $t[1], $t[2], $t[3]);
    }

Et par exemple dans le plugin Pages on l’appelle avec ce code :

dcCore::app()->url->register('pages', 'pages', '^pages/(.+)$', ['urlPages', 'pages']);

Et là, ça hurle parce que :

Fatal error: Uncaught TypeError: dcUrlHandlers::register(): Argument #4 ($handler) must be of type callable, array given, called in …/git-dc/plugins/pages/_prepend.php on line 21 and defined in …/git-dc/inc/public/lib.urlhandlers.php on line 51

On tombe sur le problème où une classe n’est pas (encore) connue et donc la méthode urlPages::pages() n’est pas définie. D’ailleurs remplacer 'urlPages' par urlPages::class ne change rien au problème.

On peut régler ça en plaçant la classe en question dans le fichier où se trouve l’enregistrement, mais c’est moyen élégant comme manière de faire.

Bref, pour l’instant, on va s’en tenir à autoriser les deux types d’argument, callable et array et présumer qu’au moment de l’exécution les classes indiquées sont connues.

On verra par la suite si c’est utile d’aller plus loin…

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15461

Haut de page