Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Alternativa Variables variables y $this

Estas en el tema de Alternativa Variables variables y $this en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos : ) Quiero hacer un metodo getNameValue($name), que en función de si el atributo $this->method es igual a "POST" o "GET este metodo ...
  #1 (permalink)  
Antiguo 16/11/2008, 01:44
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Alternativa Variables variables y $this

Hola amigos : )

Quiero hacer un metodo getNameValue($name), que en función de si el atributo $this->method es igual a "POST" o "GET este metodo cree dinámicamente esas variables i digamos recupere el valor que tienen.

Quiero esto para tener flexibilidad en torno a si los datos vendrán de POST o GET o quizá de alguna otra superglobal ; ) como podría llegar a ser... SESSION.

Con variables variables podría hacerse así:

Código PHP:
$method "_GET";
$field "name";
${$
$method}[$field] = "value";           // es sería para el set
$value = ${$$method}[$field];            // y esto para get 
Esto sería semejante (dinámicamente) a:

Código PHP:
$_GET['name'] = "value"

Y de esta forma podría tener un objeto que me recuperase el valor de esas superglobales generadas dinámicamente en tiempo de ejecución en función del valor de method. (es lo que llaman lazy loading, no ?)

El problema !!! Es que si se hace en PHP5 OO... Las variables variables no funcionan usando $this para referenciar dinamicamente...

y llevo buena parte de la madrugada dandole vueltas. Pero no se como ingeniarmelas para conseguir el mismo resultado Orientado a objetos.

Espero que se entienda lo que quiero decir, son las 8:40 y no he dormido... Si alguién le interesa, fuese tan amable de ayudar o ve más simple la solución ke yo. Se lo agradecería mucho !!!

Última edición por yoguuu; 16/11/2008 a las 01:52
  #2 (permalink)  
Antiguo 16/11/2008, 10:22
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Alternativa Variables variables y $this

Estimado:

Primero no entiendo para qué necesitas hacer todo esto.

Segundo, tanto problema con un array de sistema?

Si es un array, recórrelo y punto, ahí tienes todos los elementos para cargarlos dinámicamente, no necesitas "variables variables".

Y si no quieres diferenciar entre GET y POST, usa REQUEST.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #3 (permalink)  
Antiguo 16/11/2008, 12:29
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Alternativa Variables variables y $this

Cita:
Estimado:

Primero no entiendo para qué necesitas hacer todo esto.
Gracias por la respuesta primero de todo. Si, reconozco que el post puede ser un poco ambiguo, no había dormido. La cuestión es que quería hacer una clase para validar inputs (validar formularios). Pues es un engorro cuando tienes que hacer algo y validar a mano. Para ello de momento hice esto:

Código PHP:
class InputValidator {
    
    private 
$_method;
    private 
$_errorList = array();
    
    public function 
__construct($method NULL) {
        
$this->unsetErrorList();   // Limpia el array de errores
        
if(isset($method)) {
            
$this->_method $method;
        }
    }
    
    public function 
setMethod($method){
        
$this->_method $method;
    }
    
    public function 
getMethod(){
        return 
$this->method;
    }
    
/* Como no supe crear una variable dinámica en función del valor
de $this->method hice este metodo provisional que discrimina entre 
POST o GET explicitamente y devuelve la variable de cada caso... 

Lo que pretendía era, un metodo que en función de pasarle el nombre
de la clave de 'x' tipo superglobal, este generase la variable y retornase su valor.
De esta forma ganaría en genericidad y flexibilidad. Pienso.

*/
    
public function getNameValue($field) {
        if (
$this->_method == "POST") {
            return 
$_POST[$field];
        }
        if (
$this->_method == "GET") {
            return 
$_GET[$field];
        }
    }
// Un filtro isEmpty
    
public function isEmpty($field$msg) {
        
$value $this->getNameValue($field);  // En cada filtro obtendría el valor del campo, sin importar de donde viene no solo get o post
        
if (trim($value) == "") {
            
$this->_errorList[] = array("field" => $field"value" => $value"msg" => $msg);
            return 
false;
        } else {
            return 
true;
        }
    }

// Retorna el array de errores para ser manejado...
    
public function getErrorList()    {
        return 
$this->_errorList;
    }

// Comprueba el nº de errores
    
public function isError() {
        if (
sizeof($this->_errorList) > 0) {
            return 
true;
        } else {
            return 
false;
        }
    }

// resetea la lista de errores
    
public function unsetErrorList(){
        
$this->_errorList = array();
                
// También...    unset($this->_errorList);
    
}

Luego para usarlo sería básicamente algo así:

Código PHP:
<?php

$iv 
= new InputValidator();
$iv->setMethod("GET");
$iv->isEmpty('user''El campo "Usuario" no puede estar vacío.');

if (
$iv->isError()){
    echo 
"Hay errores <BR />";

    
$errors $iv->getErrorList();

    echo 
"<ul>";
    foreach (
$errors as $e) {
        echo 
"<li>" $e['field'] . "<BR />" $e['value'] .  "<BR />" $e['msg'];
    } 
    echo 
"</ul>";    
} else {
    echo 
"No hay errores";
}


?>
Y aunque al usar la clase solo defines un metodo (setMethod("x"))... si puedo hacer directamente la función que obtiene los valores para que soporte otros tipos de input, es lo que preferiría hacer. Por que los filtros podría hacerlos indistintamente. Me interesaba hacerlo así por no tener que incluir el tipo de input en la firma de los metodos de filtro. De esta forma lo trabajaría de forma interna. Simplicando el uso.

Cita:
Segundo, tanto problema con un array de sistema?

Si es un array, recórrelo y punto, ahí tienes todos los elementos para cargarlos dinámicamente, no necesitas "variables variables".
¿ Con array de sistema te refieres a las SUPERGLOBALES ? Como digo, sabría discriminar explicitamente entre un tipo o otro de superglobal, por simple control de flujo, pero... no cargarlo dinámicamente. Mi creatividad no me da... :S

Cita:
Y si no quieres diferenciar entre GET y POST, usa REQUEST.
Lo tengo en mente, pero no sé si me interesa tratar todos los input como un solo tipo... No quiero perder la identidad de que tipo de input viene... si post, get, session etc...

Última edición por yoguuu; 16/11/2008 a las 12:44
  #4 (permalink)  
Antiguo 16/11/2008, 15:37
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Alternativa Variables variables y $this

Estimado, lamentablemente sigo sin ver la utilidad de lo que quieres hacer.

Tienes los array's del sistema: $_GET, $_POST y $_REQUEST

Si quieres saber si tienes un GET o un POST podrías llegar a hacer un count de GET y de POST, si dan > 0 es que te enviaron un GET o un POST.

Por el otro lado te sugiero que te apoyes en herramientas que ya están listas para resolver todos estos problemas, tratemos de perder el tiempo con cosas nuevas o con concluir con un sistema, más que reinventar la rueda.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 16/11/2008, 18:02
Avatar de Deschamps  
Fecha de Ingreso: octubre-2008
Mensajes: 257
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Alternativa Variables variables y $this

Cita:
Iniciado por yoguuu Ver Mensaje
(..) Quiero hacer un metodo getNameValue($name), que en función de si el atributo $this->method es igual a "POST" o "GET este metodo cree dinámicamente esas variables i digamos recupere el valor que tienen (..)
Imagino que buena parte de tus tribulaciones tendrán explicación en este párrafo del manual que cito literalmente: "Warning: Por favor tenga en cuenta que las variables variables no pueden usarse con las Matrices superglobales de PHP al interior de funciones o métodos de clase".

Sobre lo que pretendes hacer, la verdad es que tampoco acabo de encontrarle mucho sentido, a menos que sea por simple comodidad (aunque redundante). En cualquier caso, es posible que la alternativa de usar referencias a los arrays superglobales pueda resultarte interesante. Por ejemplo:

Código php:
Ver original
  1. class TestASG {
  2.    
  3.     private $asg, $met;
  4.    
  5.     public function __construct ( $cual = NULL ) {
  6.        
  7.         self::setArray( isset($cual) ? $cual : 'POST' ); // Valor predeterminado
  8.     }
  9.    
  10.     public function setArray( $cual ) {
  11.         switch( $this->met = $cual ) {
  12.             case 'GET'  : { $this->asg =& $_GET;  break; }
  13.             case 'POST' : { $this->asg =& $_POST; break; }
  14.             default     : { $this->asg = NULL;    break; }
  15.         }
  16.     }
  17.  
  18.     public function echoArray() {
  19.         echo "\$_" . $this->met . "\n";
  20.     }
  21.  
  22.     public function echoVar( $item ) {
  23.         echo $this->asg[$item]."\n";
  24.     }
  25.  
  26.     public function echoVars() {
  27.         while(list($key,$val) = each($this->asg))
  28.             echo "[$key] = $val\n";
  29.     }
  30.  
  31.     public function setVar( $item, $valor ) {
  32.         $this->asg[$item] = $valor;
  33.     }
  34. }

Como ejemplo de uso:

Código php:
Ver original
  1. $_POST['foo'] = "Hola";
  2. $_GET['foo'] = "Mundo";
  3.    
  4. $test = new TestASG();        // Referencia por defecto a $_POST
  5. $test->echoVar('foo');        // Salida: "Hola"
  6. $test->setArray('GET');       // Cambia referencia a $_GET
  7. $test->echoVar('foo');        // Salida: "Mundo"
  8.    
  9. $test->setArray('POST');
  10. $test->setVar('foo','Adiós'); // Actualiza $_POST['foo'] = "Adiós"
  11. $test->setVar('bar','Chau');  // Crea $_POST['bar'] = "Chau"
  12. $test->echoArray();           // Salida: "$_POST"
  13. $test->echoVars();            // Muestra índices y valores
  14.  
  15. var_dump($_POST);

Con el que obtendrías esta salida:

Código:
Hola
Mundo
$_POST
[foo] = Adiós
[bar] = Chau

array(2) {
  ["foo"]=>
  string(5) "Adiós"
  ["bar"]=>
  string(4) "Chau"
}
Un saludo.
  #6 (permalink)  
Antiguo 16/11/2008, 18:18
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Respuesta: Alternativa Variables variables y $this

Y así por que no?

Código PHP:
$iv = new InputValidator();
$iv->setMethod($_GET);
$iv->isEmpty('user''El campo "Usuario" no puede estar vacío.'); 
Saludos
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #7 (permalink)  
Antiguo 16/11/2008, 18:31
Avatar de Deschamps  
Fecha de Ingreso: octubre-2008
Mensajes: 257
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Alternativa Variables variables y $this

Tendría que modificar la asignación al atributo _method para que fuese por referencia. En caso contrario estaría trabajando con una copia del array superglobal (no podría modificar elementos en el original con el plantemiento actual). Además, supongo que pasando directamente el array como parámetro dificulta la consulta del array asignado en un momento dado (el método getMethod).
  #8 (permalink)  
Antiguo 17/11/2008, 10:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Alternativa Variables variables y $this

Mmmm y digo en el caso que es "necesario" hacerlo como pones, usas los métodos mágicos de PHP __get, __set para eso?

Saludos.
  #9 (permalink)  
Antiguo 19/11/2008, 03:15
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Alternativa Variables variables y $this

Hola, disculpadme por la tardanza.

Gracias a todos, en especial a Deschamps ya que te curraste el ejemplo... Gracias. Básicamente por que con esto "$this->asg =& $_GET;" me hiciste entender como hacerlo. A parte, muy inteligente lo de la referencia. Sobretodo si se trabajase con varias instancias imagino.

Cita:
Mmmm y digo en el caso que es "necesario" hacerlo como pones, usas los métodos mágicos de PHP __get, __set para eso?
Tanto como necesario... no : ) Pero te entiendo, "en el caso que quisieramos hacerlo así", entonces...

Si me había planteado la posibilidad de hacerlo usando las sobrecargas de set y get. Pero en caso de usarlas... Significaría que todas esas asignaciones o accesos tendrían el comportamiento que le den las sobrecargas no ? No sé si eso es lo que me interesa. No creo...

Uhmmmm aunque... ¿ si podría hacerlo igual con __get y __set sin que afecte al comportamiento de cada set o get si impongo condiciones (if, switch, etc...) no ? LOL me estoy respondiendo yo mismo... Pero la dejo en el aire. Que me conozco y la lio...

Última edición por yoguuu; 19/11/2008 a las 03:24 Razón: una tonteria...
  #10 (permalink)  
Antiguo 19/11/2008, 10:07
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Alternativa Variables variables y $this

La idea de usar __get y __set es para eso para poder darle esa "flexibilidad" a tu clase, sin meterte a cosas un poco más complejas como variables variables.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:31.