web-dev-qa-db-fra.com

Le gestionnaire de méthode __callStatic transmis à add_action provoque un bogue dans PHP <5.3

J'ai une classe qui gère AJAX demandes de mon plugin. La classe a un wrapper __callStatic pour toutes les actions, qui appelle ensuite des méthodes non statiques pour chaque action, comme ceci:

class TP_AJAX_wrapper {

 public static function __callStatic( $name, $args = null ) {
  check_ajax_referer( 'tp_ajax_nonce' );

  $out = array();

  try {
   $res = call_user_func( array( __CLASS__, $name ) );
  } catch(Exception $e) {
   $out['error'] = $e->getMessage();
  }

  $out['responseStatus'] = $res ? 'ok' : 'null';
  $out['response'] = $res;

  echo json_encode($out);

  die();
 }

 protected static function someAction() {
  return array( 'someValue' => 3 );
 }
}

Ensuite, j'ai un tableau d'actions que j'initialise en utilisant:

foreach ( $ajax_actions as $action ) {
    add_action ( 'wp_ajax_tp_'.$action, array( 'TP_AJAX_wrapper', $action ) );
}

Cela fonctionne très bien pour PHP 5.3+, mais échoue lamentablement sur les anciennes versions.

Avertissement : call_user_func_array () [function.call-user-func-array]: le premier argument devrait être un rappel valide, 'TP_AJAX_wrapper :: someAction 'a été donné dans /chemin/vers/wordpress/wp-includes/plugin.php en ligne 395

Comme il est écrit dans un plugin, utilisé sur toutes sortes d'hôtes, dont certains supportent PHP 5.3, d'autres non, je dois le rendre un peu plus flexible. Ce que je ne peux pas comprendre, c'est un moyen d'émuler __callStatic (introduit en 5.3) pour les anciennes versions de PHP.

Ce que je recherche, c'est un moyen d'émuler le wrapper __callStatic pour les anciennes versions. J'ai aussi essayé d'utiliser __call, qui est supposé gérer les appels de méthodes statiques si le premier argument est un nom de classe, plutôt qu'un objet, mais j'obtiens toujours la même erreur.

Halp?

1
TTL

Il n'y a pas de fonction magique __callStatic dans PHP <5.3. En tant que tel, il ne peut pas être identifié en tant que rappel.

Comme WordPress ne valide pas avant d'appeler un rappel avec des filtres et des points d'ancrage, vous obtenez l'avertissement PHP, car l'exécution sur PHP <5.3 n'est pas un rappel valide.

Vous pouvez modifier la conception de vos rappels pour qu'elle soit non statique et utiliser la fonction magique __call qui est disponible avec les versions antérieures PHP. _ 5 versions si vous recherchez une fonctionnalité similaire.

Mais s'en tenir à PHP 5.3 n'est pas si grave.

1
hakre

http://php.net/manual/en/keyword.class.php

Attention
PHP réserve tous les noms de fonctions commençant par __ comme magiques. Il est recommandé de ne pas utiliser de noms de fonction avec __ dans PHP sauf si vous souhaitez des fonctionnalités magiques documentées.

Je ne connais pas grand chose au sujet des classes, mais il pourrait s'agir de l'espacement des noms que vous utilisez pour la ou les fonctions posant problème.

Je peux me tromper, bien sûr..

0
t31os