2010-10-03 3 views
5

Ceci n'est pas une réelle interface fluide. J'ai un objet qui construit une pile de méthodes. Qui est exécuté par un seul appel de fonction. Mais maintenant, je pourrais ajouter une autre méthode virtuelle, qui "prend le relais" de cette pile de méthodes.méthode de piratage de chaîne


Cas d'utilisation: J'enveloppe mes superglobales dans des objets. Cela me permet de "forcer" le filtrage d'entrée. $ _GET et co fournissent des méthodes simples d'assainissement. Et ma nouvelle version permet maintenant le chaînage des filtres atomiques. Par exemple:

$_GET->ascii->nocontrol->text["field"] 

Ceci est un appel de méthode. Il utilise des chevrons. Mais c'est juste une bonne astuce qui facilite la réécriture de toute occourion de $_GET["field"]. En tous cas.

Maintenant, il existe aussi parfois des formulaires avec des champs énumérés, comme dans le champ [0], le champ [1], le champ [2]. C'est pourquoi j'ai ajouté une méthode de filtre virtuel -> array. Il détourne la pile de méthodes collectées et itère les filtres restants, par ex. une valeur de tableau $ _POST. Par exemple $_POST->array->int["list"].

mise en oeuvre peu raccourcie:

function exec_chain ($data) { 
    ... 
    while ($filtername = array_pop($this->__filter)) { 
    ... 
     $data = $this->{"_$filtername"} ($data); 
    ... 
} 

function _array($data) { 
    list($multiplex, $this->__filter) = array($this->__filter, array()); 
    $data = (array) $data; 
    foreach (array_keys($data) as $i) { 
     $this->__filter = $multiplex; 
     $data[$i] = $this->exec_chain($data[$i]); 
    } 
    return $data; 
} 

La pile de méthode est assemblé dans la liste $this->__filter. Au-dessus de exec_chain(), il boucle juste dessus, en enlevant chaque fois le nom de la première méthode. Le gestionnaire _array virtuel est généralement la première méthode. Et il vole simplement cette pile de méthodes, et réexécute le reste sur chaque élément du tableau. Pas exactement comme dans le code d'exemple ci-dessus, mais il ne fait que repeupler la pile de méthode originale.

Cela fonctionne. Mais c'est un peu sale. Et je pense à ajouter une autre méthode virtuelle ->xor. (YAGNI?) Ce qui ne se contenterait pas d'itérer sur les champs, mais plutôt d'évaluer si les filtres alternatifs ont réussi. Par exemple $_REQUEST->array->xor->email->url["fields"]. Et je me demande s'il existe un meilleur modèle pour détourner une liste de fonctions. Mon échange de listes de hooks ($ this -> __ filter) ne se prête pas à l'enchaînement. Hmm bien en fait, l'exemple -> xor n'aurait pas besoin d'itérer/se comporter exactement comme -> array.

Donc spécifiquement, je suis intéressé à trouver une alternative à l'utilisation de ma liste de filtres $ this -> __ avec array_pop() et l'échange sournois. C'est mauvais. Existe-t-il un meilleur schéma d'implémentation pour l'exécution d'une liste de méthodes à mi-chemin entre moi et moi?

+1

Ce n'est pas vraiment clair ce que vous demandez. Il est également difficile de ne pas réagir à l'interface «fluide» et de suggérer que vous fassiez quelque chose d'autre (!) Même si vous avez précisé que vous ne posez pas de questions sur cette partie. –

+0

Gah, putain d'entrer-soumettre-mais-seulement-dans-comment-boîtes me mord encore .... Pouvez-vous développer le cas d'utilisation où vous pensez que vous avez besoin de quelque chose de plus intelligent. D'après ce que je peux dire du code que vous avez collé, vous avez quelque chose qui fait ce que vous voulez, et ce n'est pas trop terrible - je m'oppose plus à l'interface fluide qu'à la mise en œuvre. –

+0

Eh bien, cela fonctionne. Mais le hooklist-hotswapping semble vraiment sale. Et objectivement c'est juste une question de featuritis, pas sûr si j'ai vraiment besoin de la nouvelle méthode de virtal. C'est quelque chose qui pourrait être manipulé par la logique de l'application, on a juste l'impression d'appartenir au gestionnaire d'entrée.Quoi qu'il en soit, devrais-je besoin du -> xor ou d'une autre nouvelle fonctionnalité dont j'ai besoin pour me débarrasser de la manipulation de la pile simultanée. C'est le point principal de ma question. – mario

Répondre

2

J'ai déjà fait une interface de chaînage similaire, j'aime votre idée de l'utiliser sur les variables GET/POST. Je pense que vous feriez mieux de faire quelque chose comme

$var->array->email_XOR_url;
plutôt que
$var->array->email->XOR->url;
. De cette façon, vous pouvez attraper les différentes combinaisons avec votre magie d'appel __get/__.

+0

Pas ce que je voulais. Mais au lieu de compliquer davantage mon code, je vais adopter cette approche. Gérer cette fonctionnalité dans __call est certainement plus simple que d'ajouter une autre solution de contournement. Ou je pourrais même essayer une simple méthode '-> xor (var, filter1, filter2, filter3)'. – mario

+0

Oui, je ne l'aime pas non plus. Utiliser $ var-> array-> xor ('email', 'url') semble être la meilleure option. – bobdiaes

+0

En fait, je pense que vous devriez vous débarrasser du filtre de tableau, car il est toujours à la position 1. Il suffit de retourner un commutateur dans le constructeur. Si le commutateur est activé, des chaînes seront appliquées à chaque membre du groupe. – bobdiaes

Questions connexes