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

Duda con el uso de ::

Estas en el tema de Duda con el uso de :: en el foro de Frameworks y PHP orientado a objetos en Foros del Web. En uno de los mensajes encontré este script: Código PHP: class  DAC      {         var  $db ;                  function & create (  $name ,  $dac_type = ...
  #1 (permalink)  
Antiguo 07/03/2006, 15:29
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Duda con el uso de ::

En uno de los mensajes encontré este script:
Código PHP:
class DAC
    
{
        var 
$db;
        
        function &
create$name$dac_type="mysql" )
        {
          if (
$dac_type == "mysql") {
            switch ( 
$name )
            {
                case 
"news"       : return new MySQLNews(); break;
                case 
"users"      : return new MySQLUsers(); break;
                case 
"admins"     : return new MySQLAdmins(); break;
                ......
                ......
                default           : return 
null; break;
            }             
          }    
          if (
$dac_type == "ws") {
            switch ( 
$name )
            {
                case 
"news"       : return new WSNews(); break;
                case 
"users"      : return new WSUsers(); break;
                case 
"admins"     : return new WSAdmins(); break;
                .....
                .....
                default           : return 
null; break;
            }             
          }    
        }    
    }    

    class 
MySQLNews extends MySQLDAC   //implements IDACNews
    
{
        function 
create$news )
        {
            
$sql =  sprintf"INSERT INTO news ( 0, %s )"$news );
            return 
$this->db->execute_non_query $sqltrue );                }
    
        function 
read$id )
        {
            
$sql "SELECT * FROM news WHERE news_id = %s";
            return 
$this->db->execute_querysprintf$sql$id ) );
        }
        
        function 
get_all_news() {
            
$sql "SELECT * from news";
            return 
$this->db->execute_readersprintf$sql ) );            
        }
        
        function 
delete$id )
        {
            
$sql "DELETE FROM news WHERE news_id = %s";
            
$this->db->execute_non_querysprintf$sql$id ) );            
        }
    
        function 
MySQLNews(){ parent::MySQLDAC(); }
    } 
Mi duda en concreto es la siguiente: Si la clase MySQLNews extiende a la clase MySQLDAC, es decir, tiene sus propiedades y métodos y en ningún momento se sobreescribe el método MySQLDAC, porqué es necesario colocar parent::MySQLDAC()? No se llama de manera automática al instanciar el objeto al constructor de la clase padre si no existe constructor en la clase extendida??? No es mejor en este caso dejar la clase derivada sin constructor???

Última edición por Panino5001; 07/03/2006 a las 15:36
  #2 (permalink)  
Antiguo 07/03/2006, 16:00
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Se llama al constructor de la clase padre con parent cierto, y se llama automáticamente también es cierto. Pero como le pasas explicitamente parámetros desde la clase hija a la clase padre¿? pues sí has acertado.
  #3 (permalink)  
Antiguo 08/03/2006, 07:31
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Perdoname, Casuis, pero no te entendí bien: querés decir que efectivamente no haría falta en este caso????
  #4 (permalink)  
Antiguo 08/03/2006, 09:15
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
Supongamos que la clase padre se llama "A" y la clase hija se llama "B".

En la clase "A" vas a tener el constructor "A()", al igual que en la clase "B" vas a tener el constructor "B()".

Los detalles que debés tener en cuenta son:

* Cuando instanciás un objeto de la clase "B" se llama al constructor de la clase base implícitamente sólo si "B" no posee constructor. Por el contrario, si escribís el constructor de la clase "B" tenés que llamar al constructor de la clase base con parent::A();.
* También lo podés llamar mediante el operador $this, pero en este caso, si llegás a sobreescribir el método "A()" en la clase "B" esa línea va a llamar al método "A()" de la clase derivada "B".

En resúmen:
parent te sirve para llamar a un método de una clase base, aunque ese método se haya sobreescrito en la clase derivada y, por el contrario, $this llama a los métodos del objeto derivado en todos los casos, ya sean métodos heredados, métodos sobreescritos o métodos propios de la clase derivada.

Salduos y espero que te sirva de ayuda.
  #5 (permalink)  
Antiguo 08/03/2006, 09:21
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Gracias! Es cómo yo entendía entonces.
  #6 (permalink)  
Antiguo 08/03/2006, 11:39
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 2 meses
Puntos: 11
mientras que no te olvides que estamos en el 2006, que falta poco para el mundial, y que eso es php 4... esta todo bien.
  #7 (permalink)  
Antiguo 08/03/2006, 11:42
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
Cita:
Iniciado por Tukzone
mientras que no te olvides que estamos en el 2006, que falta poco para el mundial, y que eso es php 4... esta todo bien.
¿ Otra vez agrediendo ?
Hay formas y formas de decir las cosas.
  #8 (permalink)  
Antiguo 08/03/2006, 12:07
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 2 meses
Puntos: 11
era un chiste :) relajate
  #9 (permalink)  
Antiguo 08/03/2006, 13:44
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
La verdad, a mi también me molestó tu comentario (bueno, molestó no sé si es la palabra, sólo que fui a leerlo para ver si había algo útil en él y no había nada, lo de php 4 tal vez, pero es algo bastante obvio, no?).
Participo en el foro por 2 razones: ayudar y ser ayudado, no me interesa otra cosa, ni peleas ni acusaciones ni nada más (ni siquiera el Mundial).
La verdad, cuando en otro post webestudio dijo "escuchen a tuckzone, que sabe lo que dice" o algo por el estilo, me dije "atención, aquí debe haber alguien con mucho para enseñar y hay que estar atento".
Pero bueno, apostaré a que quizá sean sólo unos pocos posts intrascendentes, que finalmente tuckzone abandonará las peleas absurdas y se dedicará a enseñar lo mucho que seguramente sabe.
  #10 (permalink)  
Antiguo 08/03/2006, 16:12
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 2 meses
Puntos: 11
Ok, entiendo los animos que se viven en este mensaje. Cuando dije lo de php4 lo decia por la gran diferencia que existe a la hora de trabajar con objetos.

parent::MySQLDAC(); pasaria a ser en este caso parent::__construct();

Y para comparar objetos se puede usar instanceof

Cita:
if (is_object($obj))
{
if ($obj instanceof self)
echo '$obj pertenece a ' . __CLASS__;
}
Y un dato que les puede ahorrar un poco de tiempo, cuando un metodo es declarado estatico la variable $this queda sin efecto, tienen que usar self.

Y un poco mas de humor muchachos, revindiquemos la fama de aburridos que tienen los programadores. Escucharon mundial, futbol y se pusieron como locos, y por suerte no mencione a las mujeres... me linchaban!
  #11 (permalink)  
Antiguo 13/03/2006, 08:21
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Por favor, si antes de buscar ver "ese comentario no lo entendí, a ver? creo que me están agrediendo" y salir corriendo a gritar a los cuatro vientos, lean la parte del mensaje que vale la pena.

ESO es PHP4, y justamente llama a parent::MySQLDAC, por el hecho de que el esquema de objetos de PHP4 no llama automáticamente a los contructores de las clases padres, en lo que ADEMÁS, hay que hacerlo con el nombre de la clase padre. TODA una molestia, ya que para mover objetos de una parte de la jerarquía a otra, hay que reescribir demasiados métodos a veces, solo porque la clase padre es otra.

También tengan en cuenta que este no es el caso, pero es muy probable que se llame a un método de clase, y no de instancia. Y la sintaxis de doble:dospuntos (no me acuerdo como se llama ahora) es la manera de hacerlo. Este es el caso de métodos genéricos que se aplican sobre distintos tipos de datos... Ej: String::validate( $_GET['nombre'] );

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #12 (permalink)  
Antiguo 13/03/2006, 08:36
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
El operador :: (dos puntos) se llama operador unario de resolución de alcance, y en PHP4 sirve tanto para acceder a métodos de una clase base o a métodos de una clase de forma estática (sin instanciar la clase).

Cita:
Iniciado por Webstudio
ESO es PHP4, y justamente llama a parent::MySQLDAC, por el hecho de que el esquema de objetos de PHP4 no llama automáticamente a los contructores de las clases padres, en lo que ADEMÁS, hay que hacerlo con el nombre de la clase padre. TODA una molestia...
En efecto... Este inconveniente se solucionó en PHP5.

Saludos.
  #13 (permalink)  
Antiguo 13/03/2006, 09:30
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Pero eso me deja con más dudas que antes, porque no es lo que dice el manual. El manual dice: PHP 4 no llama constructores de la clase base automáticamente desde un constructor de una clase derivada. Es su responsabilidad propagar la llamada a constructores más arriba en la jerarquía cuando sea apropiado.
Y también: Los constructores son funciones en una clase que son llamadas automáticamente cuando se crea una nueva instancia de una clase con new. Una función se convierte en constructor cuando tiene el mismo nombre que la clase. Si una clase no tiene constructor, el constructor de la clase base es llamado, si existe.
Entonces, si entendí correctamente, en este ejemplo en particular en que el constructor de la clase derivada sólo se llama al de la clase padre y no se hace otra cosa, repito, según lo que yo entendí y mi duda en concreto es si es así o no (y para este caso en particular), sería lo mismo dejar sin constructor a la clase derivada, ya que al no tener constructor se llamaría automáticamente al de la clase padre. O no?
  #14 (permalink)  
Antiguo 13/03/2006, 09:47
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
Es sencillo:

Te explico un poco de teoría vieja de C para este caso en particular:

Todas las clases tienen constructores ya sea definidos de forma explícita o implícitos, es decir que el constructor puede ser omitido en la declaración de la clase.

En el caso de PHP si en una clase derivada el constructor es explícito (osea, si está el constructor), cuando se instancie dicha clase, PHP no efectúa una llamada al constructor de la clase base. Pero, por el contrario, si omitiste el constructor de la clase derivada (es decir que no está) PHP llama automáticamente al constructor de la clase base.

Para que te sea más claro sólo necesitás hacer una prueba, por ejemplo:

Código:
class Base {
  function Base() {
    echo "En base<br>";
  }
}

//==== CASO 1 ====
class Derivada1 extends Base {
  function Prueba() {
  }
}

//==== CASO 2 ====
class Derivada2 extends Base {
  function Derivada2() {
  }
}

$a = new Derivada1();
echo "---<br>";
$b = new Derivada2();
En el primer caso se va a imprimir la línea "En base", porque omitiste el constructor de la clase derivada y, por el contrario, en el segundo caso no se va a imprimir esa línea porque el constructor de la clase derivada no llama al constructor de la clase base.

Saludos.
  #15 (permalink)  
Antiguo 13/03/2006, 09:54
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Entonces,en el ejemplo esto no tiene sentido, ya que si omitimos esta función todo funciona igual, no?
Código PHP:
 function MySQLNews(){ parent::MySQLDAC(); } 
    } 
  #16 (permalink)  
Antiguo 13/03/2006, 10:01
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
Sí, es lo mismo no ponerlo.
  #17 (permalink)  
Antiguo 13/03/2006, 10:10
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Uf! Al fin la respuesta concreta! Muchas gracias!
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 16:54.