Foros del Web » Programando para Internet » PHP »

problema al heredar

Estas en el tema de problema al heredar en el foro de PHP en Foros del Web. Hola... tengo una clase hija "Autentication" que hereda métodos de una clase "Admin" ... y ambas clases usan métodos de otra clase "DB" ... en ...
  #1 (permalink)  
Antiguo 06/09/2010, 15:04
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
problema al heredar

Hola... tengo una clase hija "Autentication" que hereda métodos de una clase "Admin" ... y ambas clases usan métodos de otra clase "DB" ... en este caso "get_records_by_group"

Código PHP:

require_once ROOT.'/dbConfig/Db.class.php';

class 
Admin

     public function 
__construct(){

            
$this->getDbConnection();
     }

     public function 
listAdmin() {
        
        return 
$this->db->get_records_by_group('administrador''permiso''ASC''id');
        
     }



Código PHP:

require_once ROOT.'/dbConfig/Db.class.php';
require_once 
ROOT.'/lib/Admin.class.php';

class 
Authentication extends Admin

     public function 
__construct(){

            
$this->getDbConnection();
     }



Y mi error al llamar a la clase Autentication es:

Código PHP:

require_once '../lib/Authentication.class.php';
$does = new Authentication();
echo 
$does->listAdmin(); 
Fatal error: Call to a member function get_records_by_group() on a non-object in C:\...\Admin.class.php on line ##

¿Porqué no reconoce las funciones que usa la clase Padre?
__________________
Quitenme la vida pero no la bebida.
  #2 (permalink)  
Antiguo 06/09/2010, 15:17
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: problema al heredar

Cita:
return $this->db->get_records_by_group('administrador', 'permiso', 'ASC', 'id');
pregunto donde instancias $this-db???
y donde esta definido el el metodo que te esta dando el error xq ahi no lo detallas saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 06/09/2010, 15:24
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: problema al heredar

Sip tienes razón olvide poner eso... lo extraño es que no encuentro el botón EDITAR del foro... asi que denuevo lo pongo con la instancia:

Código PHP:

require_once ROOT.'/dbConfig/Db.class.php'

class 
Admin{  

     public function 
__construct(){

            
$this->getDbConnection();

     }
 
     public function 
getDbConnection($params null) {
            if(
$this->db === null) {
                
$this->db Db::getInstance($params);
            }
            return 
$this->db;
     }

     public function 
listAdmin() {
        
        return 
$this->db->get_records_by_group('administrador''permiso''ASC''id');
        
     }


Código PHP:

require_once ROOT.'/dbConfig/Db.class.php'
require_once 
ROOT.'/lib/Admin.class.php';

class 
Authentication extends Admin{  

     public function 
__construct(){

            
$this->getDbConnection();

     }
 
     public function 
getDbConnection($params null) {
            if(
$this->db === null) {
                
$this->db Db::getInstance($params);
            }
            return 
$this->db;
     }


Y el método: get_records_by_group() está dentro de la clase Db.class


Lo raro es que si todo lo pongo en una misma clase... funciona con normalidad, asi que pienso que cometo algún error heredando.
__________________
Quitenme la vida pero no la bebida.
  #4 (permalink)  
Antiguo 06/09/2010, 15:30
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: problema al heredar

bueno estoy comenzando en esto pero estas sobreescribiendo metodos con las mismas lineas eso como para q??? si el hijo tiene acceso a los metodos de la clase padre para que volver a colocar lo mismo?? no te parece??
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #5 (permalink)  
Antiguo 06/09/2010, 15:34
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: problema al heredar

Porque hay casos en que sólo usaré la clase Admin sin necesitar de Authentication y necesito ese constructor. Además si quito ese método repetido, aún me sale ese error.
__________________
Quitenme la vida pero no la bebida.
  #6 (permalink)  
Antiguo 06/09/2010, 15:41
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: problema al heredar

tu desde el hijo puedes llamar a el padre en Authentication puedes sencillamente llamar asi
Código PHP:
Ver original
  1. class Authentication extends Admin{  
  2.  
  3.      public function __construct(){
  4.  
  5.            parent::__construct();#y le pasas parametros si los lleva
  6.  
  7.      }
al igua que en la otra funcion que copias lo mismo no te digo q lo brres de admin te digo q no sobreescribas algo q no es necesario sobre escribir o si??? bueno es mi opinion noc si alguien mas te pueda guiar mejor
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #7 (permalink)  
Antiguo 06/09/2010, 15:50
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: problema al heredar

Cuando puse parent::__construct(); al parecer el problema se extendió... porque al obtener el contructor del padre ya no me reconoce los metodos de la instancia $this->db en Authentication, al parecer el problema es que no reconoce los métodos de la clase Db.class... acaso no basta con llamarlo con require_once
__________________
Quitenme la vida pero no la bebida.
  #8 (permalink)  
Antiguo 06/09/2010, 16:09
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: problema al heredar

Una consulta, Db::getInstance($params); le pasas parámetros para conectarse o los toma por defecto...
hace un var_dump de this->db para ver que tiene...

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #9 (permalink)  
Antiguo 06/09/2010, 16:11
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: problema al heredar

es el patrón singleton

Código PHP:

     
public function __construct() {

            
$this->getDbConnection();
            
     }
 
     public function 
getDbConnection($params null) {
     
            if(
$this->db === null) {
                
$this->db Db::getInstance($params);
            }
            return 
$this->db;
            
     }
     
     public static function 
getInstance() {
     
            if (!(
self::$_instance instanceof self)){          
                
self::$_instance=new self();
            }       
            return 
self::$_instance;
            
     } 
__________________
Quitenme la vida pero no la bebida.
  #10 (permalink)  
Antiguo 06/09/2010, 16:28
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: problema al heredar

Prueba poner el atributo $db a la clase admin....
Tendría que funcionarte luego lo que te dice carlos_belisario, del parent

Código PHP:
Ver original
  1. class Admin{  
  2.     protected $db;
  3.  
  4.      public function __construct(){
  5.  
  6.             $this->getDbConnection();
  7.  
  8.      }
  9.  
  10.      public function getDbConnection($params = null) {
  11.             if($this->db === null) {
  12.                 $this->db = Db::getInstance($params);
  13.             }
  14.             return $this->db;
  15.      }
  16.  
  17.      public function listAdmin() {
  18.        
  19.         return $this->db->get_records_by_group('administrador', 'permiso', 'ASC', 'id');
  20.        
  21.      }
  22. }

Bueno si bien los atributos deberían ser privados generalmente aquí te sacara del paso...
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #11 (permalink)  
Antiguo 06/09/2010, 16:34
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: problema al heredar

me genera este error:

Fatal error: Access level to Authentication::$db must be protected (as in class Admin) or weaker in ...


voy a seguir averiguando esto.

Edito: Bueno... tanto la clase Admin como Authentication tenían private $db. pero a ambos lo cambié a protected $db; y funciono! muchas gracias!
__________________
Quitenme la vida pero no la bebida.

Última edición por cesarpunk; 06/09/2010 a las 16:42
  #12 (permalink)  
Antiguo 06/09/2010, 17:55
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: problema al heredar

Eso es porque las variables private no se heredan, solo se heredan las públicas y las protected.

Saludos.
  #13 (permalink)  
Antiguo 06/09/2010, 17:56
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: problema al heredar

Te dejo dos enlaces uno de visibilidad de los atributos y Herencia.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Etiquetas: heredar
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 23:01.