Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con ambito de variables

Estas en el tema de Problema con ambito de variables en el foro de PHP en Foros del Web. Tres variables globales Código PHP: $argumentos  = isset( $_GET [ 'url' ]) ?  explode ( '/' ,  $_GET [ 'url' ]) : array() ; $controlador  = ( $controlador  =  strtolower ( ...
  #1 (permalink)  
Antiguo 14/06/2014, 05:21
 
Fecha de Ingreso: enero-2008
Mensajes: 581
Antigüedad: 16 años, 11 meses
Puntos: 9
Problema con ambito de variables

Tres variables globales
Código PHP:
$argumentos = isset($_GET['url']) ? explode('/'$_GET['url']) : array() ;
$controlador = ($controlador strtolower(array_shift($argumentos))) ? $controlador 'index' ;
$metodo = ($metodo strtolower(array_shift($argumentos))) ? $metodo 'index' 
Código PHP:
echo $controlador//OK
echo $metodo//OK
echo $argumentos//OK

class miClase {
//aquí no llegan las variables globales
echo $controlador//Notice: Undefined variable
echo $metodo//Notice: Undefined variable
echo $argumentos//Notice: Undefined variable

  #2 (permalink)  
Antiguo 14/06/2014, 05:43
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Problema con ambito de variables

Lee sobre $GLOBALS y global

http://www.php.net//manual/es/langua...bles.scope.php
__________________
Salu2!
  #3 (permalink)  
Antiguo 14/06/2014, 06:51
 
Fecha de Ingreso: enero-2008
Mensajes: 581
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: Problema con ambito de variables

Gracias italico76, ya estuviera en php.net y ya probara estos dos ejemplos

Código PHP:
<?php
$a 
1;
$b 2;

function 
Suma()
{
    
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}

Suma();
echo 
$b;
?>

<?php
$a 
1;
$b 2;

function 
Suma2()
{
    global 
$a$b;

    
$b $a $b;
}

Suma2();
echo 
$b;
?>
La cuestión es la siguiente

Código PHP:
<?php
//Creo las 3 variables
$argumentos = isset($_GET['url']) ? explode('/'$_GET['url']) : array() ;
$controlador = ($controlador strtolower(array_shift($argumentos))) ? $controlador 'index' ;
$metodo = ($metodo strtolower(array_shift($argumentos))) ? $metodo 'index' 

class 
miClase {
public function 
__construct() {
//Recupero las 3 variables
echo $controlador//Notice: Undefined variable
echo $metodo//Notice: Undefined variable
echo $argumentos//Notice: Undefined variable
}
}
new 
miClase();
?>

Última edición por quico5; 14/06/2014 a las 07:06
  #4 (permalink)  
Antiguo 14/06/2014, 07:31
 
Fecha de Ingreso: enero-2008
Mensajes: 581
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: Problema con ambito de variables

Este fragmento funciona
Código PHP:
    class Request {
        public function 
__construct() {
            
$this->argumentos = isset($_GET['url']) ? explode('/'$_GET['url']) : array() ;
            
$this->controlador = ($this->controlador strtolower(array_shift($this->argumentos))) ? $this->controlador 'index' ;
            
$this->metodo = ($this->metodo strtolower(array_shift($this->argumentos))) ? $this->metodo 'index' ;
        }
        public function 
controlador() {return $this->controlador;}
        public function 
metodo() {return $this->metodo;}
        public function 
argumentos() {return $this->argumentos;}
    }
    
    class 
Bootsrap {
        public function 
run(Request $p) {
            echo 
$p->controlador;
        }
    }
    
Bootsrap::run(new Request); 
Pero como se va ejecutar siempre me gustaría dejarlo de la siguiente forma
Código PHP:
<?php
//Creo las 3 variables
global $controlador$metodo$argumentos;
$argumentos = isset($_GET['url']) ? explode('/'$_GET['url']) : array() ;
$controlador = ($controlador strtolower(array_shift($argumentos))) ? $controlador 'index' ;
$metodo = ($metodo strtolower(array_shift($argumentos))) ? $metodo 'index' 

class 
miClase {
public function 
__construct() {
//Recupero las 3 variables
echo $controlador//Notice: Undefined variable
echo $metodo//Notice: Undefined variable
echo $argumentos//Notice: Undefined variable
}
}
new 
miClase();
?>

Última edición por quico5; 14/06/2014 a las 07:50
  #5 (permalink)  
Antiguo 14/06/2014, 07:54
 
Fecha de Ingreso: enero-2008
Mensajes: 581
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: Problema con ambito de variables

Supongo que tendré que ver la forma de que reciba las variables
Código PHP:
public function __construct($controlador 'a'$metodo 'b'$argumentos 'c'
Código PHP:
    //Creo las 3 variables
    
$argumentos = isset($_GET['url']) ? explode('/'$_GET['url']) : array() ;
    
$controlador = ($controlador strtolower(array_shift($argumentos))) ? $controlador 'index' ;
    
$metodo = ($metodo strtolower(array_shift($argumentos))) ? $metodo 'index' 

    class 
miClase {
        public function 
__construct($controlador 'a'$metodo 'b'$argumentos 'c') {
            
//Recupero las 3 variables
            
echo $controlador//Notice: Undefined variable
            
echo $metodo//Notice: Undefined variable
            
echo $argumentos//Notice: Undefined variable
        
}
    }
    new 
miClase(); 
  #6 (permalink)  
Antiguo 14/06/2014, 07:57
 
Fecha de Ingreso: enero-2008
Mensajes: 581
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: Problema con ambito de variables

Creo que ya estaria

Código PHP:
    //Creo las 3 variables
    
$argumentos = isset($_GET['url']) ? explode('/'$_GET['url']) : array() ;
    
$controlador = ($controlador strtolower(array_shift($argumentos))) ? $controlador 'index' ;
    
$metodo = ($metodo strtolower(array_shift($argumentos))) ? $metodo 'index' 

    class 
miClase {
        public function 
__construct($controlador$metodo$argumentos) {
            
//Recupero las 3 variables
            
echo $controlador//OK
            
echo $metodo//OK
            
print_r($argumentos); //OK
        
}
    }
    new 
miClase($controlador$metodo$argumentos); 
  #7 (permalink)  
Antiguo 14/06/2014, 11:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Problema con ambito de variables

Si, MUCHO mejor si le pasas esos parametros al constructor
__________________
Salu2!
  #8 (permalink)  
Antiguo 14/06/2014, 11:26
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Problema con ambito de variables

Quico5 tu ultima aproximación es la correcta, recuerda que te comunicas con los objetos mediante sus métodos. Es por eso que no debes de hacer uso de GLOBALS, además rompe con el principio de encapsulación y oculta dependencias ya que la firma de tu constructor no refleja lo que necesita la clase para su creación. Otro punto es que uses parámetros opcionales ya que por lo menos el argumento $argumentos puede o no estar presente.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 14/06/2014, 11:45
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Problema con ambito de variables

Ahora para no embarrarla dentro de tu clase....... consulta el tema de "visibilidad" de propiedades y metodos.
__________________
Salu2!
  #10 (permalink)  
Antiguo 14/06/2014, 12:08
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Problema con ambito de variables

Exacto también es importante ocultar información relacionada con tu objeto como bien comenta Italico76.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: ambito, variable
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 01:47.