2010-10-03 8 views
5

Esto no es real interfaz fluida. Tengo un objeto que construye una pila de métodos. Que se ejecuta con una sola llamada de función. Pero ahora podría agregar otro método virtual, que "toma el control" de esa pila de métodos.método de secuestro de cadena


Caso de uso: Estoy envolviendo mis superglobales en objetos. Esto me permite "aplicar" el filtrado de entrada. $ _GET y co proporcionan métodos simples de desinfección. Y mi nueva versión ahora permite el encadenamiento de filtros atómicos. Como ejemplo:

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

Esta es una llamada a un método. Utiliza corchetes angulares. Pero eso es solo un buen truco que facilita la reescritura de cualquier aparición de $_GET["field"]. De todas formas.

Ahora también hay ocasionalmente formularios con campos enumerados, como en el campo [0], campo [1], campo [2]. Es por eso que he agregado un método de filtro virtual -> array. Secuestra la pila de métodos recopilados y repite los filtros restantes, p. un valor de matriz $ _POST. Por ejemplo, $_POST->array->int["list"].

aplicación algo más corta:

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 pila método se monta en la lista $this->__filter. Por encima de exec_chain() simplemente pasa por encima de él, eliminando cada vez el primer nombre del método. El controlador virtual _array es generalmente el primer método. Y simplemente roba esa pila de métodos y vuelve a ejecutar el resto en cada elemento de la matriz. No exactamente como en el código de ejemplo anterior, pero solo vuelve a llenar repetidamente la pila de métodos original.

Funciona. Pero se siente algo sucio. Y estoy pensando en agregar otro método virtual ->xor. (YAGNI?) Lo cual no solo iteraría por los campos, sino que también evaluaría si los filtros alternativos fueron exitosos. Por ejemplo $_REQUEST->array->xor->email->url["fields"]. Y me pregunto si hay un mejor patrón para secuestrar una lista de funciones. Mi actual lista de enlaces ($ this -> __ filter) de intercambio no se presta para el encadenamiento. Hmm bueno en realidad, el ejemplo -> xor no necesitaría iterar/comportarse exactamente como -> array.

Así que específicamente, estoy interesado en encontrar una alternativa a mi $ this -> __ uso de la lista de filtros con array_pop() y el sneaky que lo intercambia. Esto es malo. ¿Hay un mejor esquema de implementación para ejecutar una lista de métodos de la mitad de mi parte -> la mitad de la parte usted?

+1

No está muy claro lo que estás preguntando. También es difícil no reaccionar instintivamente ante la "interfaz fluida" y sugerir que hagas algo más (!) A pesar de que dejaste claro que no estás preguntando sobre esa parte. –

+0

Gah, maldito enter-to-submit-but-only-in-comment-boxes me muerde de nuevo ... ¿Puede ampliar el caso de uso donde cree que necesita algo más inteligente? Por lo que puedo decir sobre el código que pegaste, tienes algo que hace lo que quieres, y no es demasiado terrible: me opongo más a la fluidez de la interfaz que a la implementación. –

+0

Bueno, funciona. Pero el hooklist-hotswapping parece realmente sucio. Y objetivamente es solo una pregunta de featuritis, no estoy seguro de si realmente necesito el nuevo método virtal. Es algo que podría ser manejado por la lógica de la aplicación, solo se siente como pertenecer al manejador de entrada.De todos modos, si necesito el -> xor o alguna otra característica nueva, ciertamente necesito deshacerme de la manipulación concurrente de matrices. Ese es el punto principal de mi pregunta. – mario

Respuesta

2

He hecho una interfaz de encadenamiento similar antes, me gusta su idea de usarlo en vars GET/POST.

Creo que será mejor que haga algo como

$var->array->email_XOR_url;
en lugar de
$var->array->email->XOR->url;
. De esa forma puedes ver las diferentes combinaciones con tu magia de llamada __get/__.

+0

No es lo que quería. Pero en lugar de complicar más mi código, tomaré este enfoque. Administrar esta característica en __call es definitivamente más simple que agregar otra solución alternativa. O incluso podría probar un método simple '-> xor (var, filter1, filter2, filter3)'. – mario

+0

Sí, tampoco me gusta. Usar $ var-> array-> xor ('email', 'url') parece ser la mejor opción. – bobdiaes

+0

En realidad, creo que debería deshacerse del filtro de matriz, ya que siempre está en la posición 1. Simplemente active un interruptor en el constructor. Si el conmutador está activado, se aplicará cualquier cadena a cada miembro de la matriz. – bobdiaes

Cuestiones relacionadas