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

Duda variable acceso de una clase a otra

Estas en el tema de Duda variable acceso de una clase a otra en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola , tengo esto Código PHP: $init  = new  Controller (); $init -> load -> get ( 'clase1.php' ); $init -> page  = new  Clase1 ; // Aca accedo perfecto a la variable ...
  #1 (permalink)  
Antiguo 03/09/2012, 22:08
Avatar de hackcrack  
Fecha de Ingreso: abril-2011
Mensajes: 331
Antigüedad: 13 años
Puntos: 9
Duda variable acceso de una clase a otra

Hola , tengo esto

Código PHP:
$init = new Controller();

$init->load->get('clase1.php');
$init->page = new Clase1;

// Aca accedo perfecto a la variable
echo $init->page->var;

$init->model->render($fileLoad[0]);


class 
Controller {

    public 
$load;
    public 
$model;

    function 
__construct() {
    
        
$this->init();

    }
    
    function 
init(){
        
$this->load = new Load();
        
$this->model = new Model();


    }
}

class 
Load{

    function 
__construct() {
        
    }

    public function 
get($name)
    {

            require 
$name;    

    }

}

class 
Model{

    function 
__construct() {
        
    }

    public function 
render($name,$noInclude false)
    {

                
// Aca no logro acceder a la variable
        
echo $init->page->var;

        if (
$noInclude == true) {
            require 
'views/' $name;    
        }
        else {
            require 
'head.php';
            require 
'views/' $name;
            require 
'foot.php';    
        }
    }

}

class 
Clase1 extends Controller {

    function 
__construct() {
        
                
$this->varr();
        
    }


    function 
varr() {
        
                
$this->var "Algo!";
        
    }  


Quiero saber como hacer para que la clase Model pueda tomar todas las variables de la clase Clase1.
__________________
Los mejores juegos de PC gratis en ******

Última edición por hackcrack; 03/09/2012 a las 22:15
  #2 (permalink)  
Antiguo 04/09/2012, 08:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda variable acceso de una clase a otra

Tendrías que pasarle a tu clase Model una instancia de la clase padre (Controller) para que pueda tener acceso a esas propiedades.

Saludos.
  #3 (permalink)  
Antiguo 04/09/2012, 11:00
Avatar de hackcrack  
Fecha de Ingreso: abril-2011
Mensajes: 331
Antigüedad: 13 años
Puntos: 9
Respuesta: Duda variable acceso de una clase a otra

lo siento GatorV pero no entiendo, osea que en la clase Model le ponga esto?

Código PHP:
Ver original
  1. parent::init();

Asi instanctio la function donde carga las clases?
__________________
Los mejores juegos de PC gratis en ******
  #4 (permalink)  
Antiguo 04/09/2012, 12:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda variable acceso de una clase a otra

No, tu model (para ver los datos que tienes en $init->page) tienes que forzoso hacer algo de lo siguiente:

- Declarar global $init para leerlo (mala idea).
- Pasarle por parámetro a render($init) (puede funcionar)
- Agregar un método extra para que le pases tu instancia de Controller a tu modelo directamente (puede funcionar)
- Que tu método render acepte como parámetro mejor un Traversable que sean las variables que vas a pasar a tu "View" (aunque no se porque le pusiste Model).

Saludos.
  #5 (permalink)  
Antiguo 04/09/2012, 20:02
Avatar de hackcrack  
Fecha de Ingreso: abril-2011
Mensajes: 331
Antigüedad: 13 años
Puntos: 9
Respuesta: Duda variable acceso de una clase a otra

porq declararlo como global es mala idea?
Y del ultimo punto, me podrias dar un ejemplo? busque en internet acerca de traversable pero no encontre mucho...

Una ultima cosa, como podria hacer para que cuando quiera leer la variable no tenga que escribir $init->page->miVariable, solo escribir $miVariable ? (PD: los nombres de las variables son dinamicas, asi que nose q nombres pueden tomar!)
__________________
Los mejores juegos de PC gratis en ******

Última edición por hackcrack; 04/09/2012 a las 22:55
  #6 (permalink)  
Antiguo 05/09/2012, 08:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda variable acceso de una clase a otra

Traversable es una interfaz que declara que tu variable se puede usar en un ciclo foreach sin problema.

Declararla como global rompe con lo que es POO, si estas usando POO evita usar cualquier variable global (exceptuando las variables que te da PHP, como $_GET, $_POST, $_SERVER, etc).

En ese caso tu variable tendría que ser un array, puedes usar get_object_vars, y extract.
  #7 (permalink)  
Antiguo 05/09/2012, 22:43
Avatar de hackcrack  
Fecha de Ingreso: abril-2011
Mensajes: 331
Antigüedad: 13 años
Puntos: 9
Respuesta: Duda variable acceso de una clase a otra

Osea que primero para poder usar estas variables en cualquier lugar puedo usar Traversable, pero necesito que sean un array, entonces haria lo siguiente:

si tengo:

Código PHP:
Ver original
  1. $array = array('variable1'=>'algo','variable2'=>'otra cosa'...);
  2.  
  3.  if( $array instanceof Traversable )
  4. {
  5.        echo $array[variable1];
  6. }

Y para que las pueda usar sin tener que llamar al array seria

Código PHP:
Ver original
  1. extract($array, EXTR_PREFIX_SAME, "wddx");
  2.  
  3. echo $variable1;

Estoy en lo correcto?
__________________
Los mejores juegos de PC gratis en ******
  #8 (permalink)  
Antiguo 06/09/2012, 09:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda variable acceso de una clase a otra

Traversable es una interfaz, si vas a usar arrays, no tiene caso que cheques si es un instanceof ya que no es un objeto.

La idea de usar Traversable (no es una interfaz que puedes usar como tal, tienes que usar una de sus "hijas" IteratorAggregate or Iterator) es que tu objeto se pueda iterar y extraer sus propiedades desde una manera controlable.

Respecto al uso de extract, sí eso es lo correcto, le pasas un array y extrae las variables al scope de donde fue usada.

Saludos.
  #9 (permalink)  
Antiguo 06/09/2012, 09:53
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Duda variable acceso de una clase a otra

Un apunte, lo que suele hacer para ver si algo es iterable es comprobar si es array tambien, algo asi:

Código PHP:
Ver original
  1. if(!is_array($array) || !$array instanceof \Traversable ){
  2.     throw new \RuntimeException(/***/);
  3. }

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 07/09/2012, 22:59
Avatar de hackcrack  
Fecha de Ingreso: abril-2011
Mensajes: 331
Antigüedad: 13 años
Puntos: 9
Respuesta: Duda variable acceso de una clase a otra

Cita:
Iniciado por GatorV Ver Mensaje
Traversable es una interfaz, si vas a usar arrays, no tiene caso que cheques si es un instanceof ya que no es un objeto.

La idea de usar Traversable (no es una interfaz que puedes usar como tal, tienes que usar una de sus "hijas" IteratorAggregate or Iterator) es que tu objeto se pueda iterar y extraer sus propiedades desde una manera controlable.

Respecto al uso de extract, sí eso es lo correcto, le pasas un array y extrae las variables al scope de donde fue usada.

Saludos.
No entendi nada, pero gracias igual.
Voy a optar por usar global que es lo mas sencillo y lo que me funciono.
Gracias de nuevo igualmente :)
__________________
Los mejores juegos de PC gratis en ******

Etiquetas: clase, class, variables
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:58.