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

Extender o pasar por referencia?

Estas en el tema de Extender o pasar por referencia? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola: Que me recomiendan? usar extend o pasar por referencia? Por ejemplo, tengo 3 clases 1) Conecta a la base, hace querys, etc... 2) Manejar ...
  #1 (permalink)  
Antiguo 01/11/2006, 01:01
 
Fecha de Ingreso: febrero-2005
Mensajes: 11
Antigüedad: 19 años, 2 meses
Puntos: 0
Extender o pasar por referencia?

Hola:
Que me recomiendan? usar extend o pasar por referencia?

Por ejemplo, tengo 3 clases
1) Conecta a la base, hace querys, etc...
2) Manejar los usuarios, registra, loguea, etc...
3) Maneja los productos, muestra un listado, muestra un detalle, etc..

Obiamente, las classes 2 y 3 acceden a la base de datos, entonces actualemente para acceder a los metodos de la clase 1 primero la instancio fuera de la clase y luego la asigno por referencia a una variable dentro de la clase2 y lo mismo en la clase 3.

Mi duda es si pasarla por referencia esta bien, o si es mejor extender la clase 1 dentro de la clase 2 y 3.

En fin, lo que trato es entender mejor las diferencias entre usar extend o pasar por referencia.. no se si me explico?

Gracias.
Saludos
  #2 (permalink)  
Antiguo 01/11/2006, 10:11
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
Que tal Pablo_Impallari:

Pues en tu ejemplo lo que mas te conviene es en lugar de pasarla por referencia, internamente la clase en el constructor debe de crear una instancia de tu clase 1, para que tu clase pueda utilizar todos sus metodos y funciones.
  #3 (permalink)  
Antiguo 01/11/2006, 16:14
 
Fecha de Ingreso: febrero-2005
Mensajes: 11
Antigüedad: 19 años, 2 meses
Puntos: 0
Gracias GatorV.... ahora estoy mas confundido que antes... jejejej
O sea que en ves de tener 2 opciones para usar los metodos de una classe dentro de otra... ahora tengo 3.
1) Extender la classe padre.
2) Pasar por referencia la clase padre a la clase hija.
3) Instanciar la classe padre dentro de la clase hija.

Bueno... tendré que hacer algunas pruevas y ver que conclusión saco de todo esto.

Saludos
Pablo
  #4 (permalink)  
Antiguo 01/11/2006, 17:56
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
Es mas sencillo si lo realizas de la forma que te lo propongo supon que tienes una interface DB (acceso a Bases de Datos)

Tu creas tu objeto, supongamos usuarios, y tu lo usas y lo rehusas en tus proyectos, puedes evitarte instanciar codigo al hacerlo en tu constructor. Ahora supongamos que le prestas a Fulano tu clase usuarios, pero él quiere utilizar su clase DB, lo que haces ahi es decirle, ok mi clase si sirve pero necesitas que tu clase DB implemente mi clase abstracta para que no haya problemas con metodos.

Luego usas metodos estaticos para cambiar la clase que usas, te pongo un ejemplo:
Código PHP:
interface DB {
       public function 
connect($server$user$pass);
}

class 
MySQLDB implements DB {
     private 
$link;

     public function 
connect$server$user$pass ) {
         
$this->link mysql_connect$server$user$pass );
     }


class 
Usuarios {
      private static 
$dbInterface null;

      public function 
__construct() {
            if( !isset( 
self::$dbInterface ) ) {
                  
self::$dbInterface = new MySQLDB();
            } else {
                 if( !( 
self::$dbInterface instanceof DB ) ) {
                       throw new 
Exception"Database adapter must implement interface DB" );
                 }
            }

            
self::$dbInterface->connect();
      }
      
      public static function 
setDBAdapterDB $db ) {
            
self::$dbInterface $db;
      }

En ese ejemplo tu clase usuarios por defecto va a usar MySQL DB para realizar sus consultas, pero si en un futuro quieres usar otro adaptador solo llamas a la funcion setDBAdapter con una nueva clase DB, (puede ser MSSQL, PostgreSQL, etc.)
  #5 (permalink)  
Antiguo 01/11/2006, 17:57
 
Fecha de Ingreso: febrero-2005
Mensajes: 11
Antigüedad: 19 años, 2 meses
Puntos: 0
Resultados de las pruevas:

Caso1: Usando Extend
Solo se instancia la clase hija.
Los metodos de la clase padre quedan disponibles para todas las funciones de la clase hija.
El constructor de la clase padre no se ejecuta nunca.

Caso2: Pasando por Referencia
Se debe instanciar primero la clase padre. Se ejecuta el contructor de clase padre.
Se debe pasar por referencia la clase padre dentro del constructor de la clase hija.
El constructor de la clase padre no se ejecuta de nuevo.
Los metodos de la clase padre quedan disponibles para todas las funciones de la clase hija.

Caso3: Instanciando la clase padre en la clase hija
Dentro del constructor de la clase hija, se instancia la clase padre. Se ejecuta el constructor de la clase padre.
Los metodos de la clase padre quedan disponibles para todas las funciones de la clase hija.

Esas son las diferencias que he encontrado yo... si alguien quiere agregar o corregir algo, bienvenido sea.

Saludos
Pablo
  #6 (permalink)  
Antiguo 01/11/2006, 17:59
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
Usando Extend, necesitas llamar explicitamente al constructor para que funcione:
Código PHP:
class padre {
     public function 
__construct() {
          echo 
"He aqui el constructor padre";
     }
}

class 
hija extends padre {
      public function 
__construct() {
          
parent::__construct();
          echo 
"He aqui el constructor hijo...";
      }

  #7 (permalink)  
Antiguo 01/11/2006, 18:00
 
Fecha de Ingreso: febrero-2005
Mensajes: 11
Antigüedad: 19 años, 2 meses
Puntos: 0
Muchas gracias GatorV.
Se puede hacer lo mismo utilizando php4?
  #8 (permalink)  
Antiguo 01/11/2006, 18:02
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
Uy.. hubieras empezado por ahi jaja, si si se puede pero te quitas los beneficios de los metodos estaticos, y de las variables estaticas, para ello usas solo el metodo estatic, pero es una variable global.

Si estas trabajando PHP4, la mejor ruta creo en efecto es la 2da.
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 10:44.