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

Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solucion???????

Estas en el tema de Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solucion??????? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buen dia: Una pregunta si una clase se conecta a un Bd y otras clases son hijas de ella y otras subclases son hijas de ...
  #1 (permalink)  
Antiguo 07/05/2010, 16:20
 
Fecha de Ingreso: abril-2010
Mensajes: 17
Antigüedad: 14 años
Puntos: 5
Información Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solucion???????

Buen dia:

Una pregunta si una clase se conecta a un Bd y otras clases son hijas de ella y otras subclases son hijas de las hijas de ella habria alguna forma de no repetir la conexion mediante la herencia y como seria...???
por ejm : si es una clase Sistem --> User ---> UserAdm y sistem se conecta a la BD y si su hijo User hace consultas y el sub hijo UserAdm tambien lo hace como no repetir la conexion... en el modelo del Sistema??????
  #2 (permalink)  
Antiguo 07/05/2010, 16:29
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

Eso lo puedes lograr usando parent sin necesidad de instanciar.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 07/05/2010, 16:37
 
Fecha de Ingreso: abril-2010
Mensajes: 17
Antigüedad: 14 años
Puntos: 5
Respuesta: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

Tendria que poner parent en cada constructor de cada una de las clases hijas???? pero si creo la conexion a la BD en el constructor padre los hijos no derian tambien estar conectados a la BD????????
  #4 (permalink)  
Antiguo 07/05/2010, 17:12
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

A lo que me refiero es algo así
Código PHP:
Ver original
  1. <?php
  2. class classConnectDb{
  3.     private $mysql_host;
  4.     private $mysql_user;
  5.     private $mysql_pass;
  6.     private $mysql_db;
  7.     protected $connect_db;
  8.  
  9.     public function __construct($host, $user, $pass, $db){
  10.         $this->mysql_host = $host;
  11.         $this->mysql_user = $user;
  12.         $this->mysql_pass = $pass;
  13.         $this->mysql_db = $db;
  14.     }
  15.  
  16.     public function connectDb(){
  17.         $this->connect_db = mysql_connect($this->mysql_host, $this->mysql_user, $this->mysql_pass) or die(mysql_error());
  18.         mysql_select_db($this->mysql_db,$this->connect_db);
  19.     }
  20. }
  21.  
  22. class query extends classConnectDb{
  23.     protected $mysql_query;
  24.  
  25.     public function __construct($host, $user, $pass, $db){
  26.         parent::__construct($host, $user, $pass, $db);
  27.     }
  28.  
  29.     public function query($query){
  30.         $this->mysql_query = mysql_query($query, $this->connect_db) or die(mysql_error());
  31.     }
  32. }
  33.  
  34. class fetch extends query{
  35.     public function __construct($host, $user, $pass, $db){
  36.         parent::__construct($host, $user, $pass, $db);
  37.     }
  38.  
  39.     public function fetchQuery(){
  40.         return mysql_fetch_assoc($this->mysql_query);
  41.     }
  42. }
  43.  
  44. $obj = new fetch('hostname','username','password','database');
  45. $obj->connectDb();
  46. $obj->query('SELECT * FROM tabla');
  47. while($row = $obj->fetchQuery()){
  48.     var_dump($row);
  49. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 07/05/2010, 17:45
 
Fecha de Ingreso: abril-2010
Mensajes: 17
Antigüedad: 14 años
Puntos: 5
Respuesta: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

Ah... Esta mas entendible... Pero esto lo haces explicitamente en cada clase hija,...no deveria de ser automatico... si ya el padre ya se conecto... los hijos tmb deveria estarlo implicitamente??
creo que en java es asi... el hijo llama al constructor del padre... de manera implicita o me equivoco??? o para PHP no hay de otra que hacerlo de la manera como me has indicado????

Uhmmm... para esto ... si ejecuto la funcion de conexion en la clase padre?? asi:

Código PHP:
class classConnectDb{

    private 
$mysql_host;
    private 
$mysql_user;
    private 
$mysql_pass;
    private 
$mysql_db;
    protected 
$connect_db;
 
    public function 
__construct($host$user$pass$db){
        
$this->mysql_host $host;
        
$this->mysql_user $user;
        
$this->mysql_pass $pass;
        
$this->mysql_db $db;
        
connectDb();    // se agrego
    
}
 
    private function 
connectDb(){ ... }  // se cambio a private

Con esto de manera implicita las clases hijas estarian conectadas ya????
o no seria asi..???

Última edición por aries_19_mad; 07/05/2010 a las 18:06 Razón: Correcion
  #6 (permalink)  
Antiguo 07/05/2010, 18:43
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

Si te fijas bien en la instancia
Código PHP:
Ver original
  1. $obj = new fetch('hostname','username','password','database');
llamé al nieto (si es que se puede decir de esa forma). Todas los métodos se llamaron implicitamente, es decir desde el nieto llamé los metodos del abuelo (si es que podemos decirlo de esta forma) y del padre. Te expongo otro ejemplo para que quedes claro
Código PHP:
Ver original
  1. <?php
  2. class fooBarCandy{
  3.     private $bar;
  4.  
  5.     public function __construct($bar){
  6.         $this->bar = $bar;
  7.     }
  8.  
  9.     public function bar(){
  10.         return $this->bar;
  11.     }
  12. }
  13.  
  14. class fooBar extends fooBarCandy{
  15.     private $candy;
  16.  
  17.     public function candy($candy){
  18.         return $this->candy = $candy;
  19.     }
  20. }
  21.  
  22. class foo extends fooBar{
  23.  
  24. }
  25.  
  26. $obj = new foo('fooBarCandy');
  27. echo $obj->bar() . '<br />';
  28. echo $obj->candy('fooBar');
Si te fijas la clase nieta no tiene nada y desde la clase nieta llamo tanto los método de la clase padre y la clase abuelo, porque ya están declaradas implicitamente.

Ahora en el primer ejemplo que te indique el único método que no llamé implícito es el de __contruct porque me daba un error (Warning: mysql_query() expects parameter 2 to be resource, null given in ....... on line 26) en la parte del query, pero si le coloco el constructor como te indiqué funciona correctamente. Entonces me gustaría saber ¿por qué en el primer ejemplo que expongo, tengo que forzosamente indicarle el __construct de la clase abuela a la clase padre? ¿No es de suponer que lo tome implícitamente? Eso sí, no es necesario indicar, en el primer ejemplo, la última clase el __construct.

En fin el primer ejemplo se puede hacer de esta forma sin errores:
Código PHP:
Ver original
  1. <?php
  2. class classConnectDb{
  3.     private $mysql_host;
  4.     private $mysql_user;
  5.     private $mysql_pass;
  6.     private $mysql_db;
  7.     protected $connect_db;
  8.  
  9.     public function __construct($host, $user, $pass, $db){
  10.         $this->mysql_host = $host;
  11.         $this->mysql_user = $user;
  12.         $this->mysql_pass = $pass;
  13.         $this->mysql_db = $db;
  14.     }
  15.  
  16.     public function connectDb(){
  17.         $this->connect_db = mysql_connect($this->mysql_host, $this->mysql_user, $this->mysql_pass) or die(mysql_error());
  18.         mysql_select_db($this->mysql_db,$this->connect_db);
  19.     }
  20. }
  21.  
  22. class query extends classConnectDb{
  23.     protected $mysql_query;
  24.  
  25.     public function __construct($host, $user, $pass, $db){
  26.         parent::__construct($host, $user, $pass, $db);
  27.     }
  28.  
  29.     public function query($query){
  30.         $this->mysql_query = mysql_query($query, $this->connect_db) or die(mysql_error());
  31.     }
  32. }
  33.  
  34. class fetch extends query{
  35.     public function fetchQuery(){
  36.         return mysql_fetch_assoc($this->mysql_query);
  37.     }
  38. }
  39.  
  40. $obj = new fetch('hostname','username','password','database');
  41. $obj->connectDb();
  42. $obj->query('SELECT * FROM tabla');
  43. while($row = $obj->fetchQuery()){
  44.     var_dump($row);
  45. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 07/05/2010 a las 20:37
  #7 (permalink)  
Antiguo 08/05/2010, 08:09
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: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

Conceptualmente estás equivocado, partamos desde ahí (no es mayor problema, se puede arreglar )

Solo puede haber herencia si hay una relación de parentesco, por lo tanto lo único que podría haber es una clase genérica BaseDeDatos y luego clases hijas que especialicen este clase, como ser MySQL, PostgreSQL, etc.

Lo que sí podría haber es una relación de uso entre una clase que quiera hacer persistencia, es decir: Usuario -> BaseDeDatos, ya que la clase Usuario quiere hacer uso de la funcionalidad de persistencia.

El diseño podría ser el siguiente:



Solo habría herencia cuando hay una relación de parentesco, como por ejemplo Admin, donde heredaría de la clase Usuario y de paso, como la clase Usuario ya maneja su persistencia, la clase Admin lo haría (pero no es "la razón de la herencia", es la consecuencia de la misma; no estamos haciendo herencia para poder reusar la persistencia, solo porque necesitas crear una nueva entidad que se basa en Usuario pero tienen algunas particularidades que necesitas diferenciar).

Pero herencia nunca es "reuso mecánico", tienes que pensar en todo esto con UML y analizar bien las relaciones antes de codificar, como quién hace un diagrama DER / MER en base de datos.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 08/05/2010, 09:44
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar repetidas llamadas a Metodos, Persistencia y herencia seria la solu

Claro, sé que conceptualmente es un desastre. Pero contestando la pregunta específicamente, sobre si los métodos son llamados implícitamente sobre los hijos, entiendo que así es. El problema es más bien en el ejemplo que indiqué.

Tenemos una clase llamada classConnectDb, luego otra clase hija llamada query y luego otra clase nieta (si es que se puede decir de esa forma) llamada fetch. Si llamo desde la clase nieta todos los métodos de la clase padre y la del abuelo ( sigo diciendo, si es que podemos llamarla de esa forma) me salta un error (Warning: mysql_query() expects parameter 2 to be resource, null given in ....... on line 26), entonces lo que hice fue colocar estas líneas en la clase query
Código PHP:
Ver original
  1. public function __construct($host, $user, $pass, $db){
  2.     parent::__construct($host, $user, $pass, $db);
  3. }
Y funciona perfectamente. Ahora mi pregunta es, ¿por qué, en este ejemplo, tengo que colocar el constructor en la clase padre forzosamente para que funcione el código si con el segundo ejemplo, funciona sin necesidad de indicar el constructor en la clase de padre?

Este es el segundo ejemplo
Código PHP:
Ver original
  1. <?php
  2. class fooBarCandy{
  3.     private $bar;
  4.  
  5.     public function __construct($bar){
  6.         $this->bar = $bar;
  7.     }
  8.  
  9.     public function bar(){
  10.         return $this->bar;
  11.     }
  12. }
  13.  
  14. class fooBar extends fooBarCandy{
  15.     private $candy;
  16.  
  17.     public function candy($candy){
  18.         return $this->candy = $candy;
  19.     }
  20. }
  21.  
  22. class foo extends fooBar{
  23.  
  24. }
  25.  
  26. $obj = new foo('fooBarCandy');
  27. echo $obj->bar() . '<br />';
  28. echo $obj->candy('fooBar');
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: clases, herencia, metodos, redundancia
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:12.