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

Herencia de clases con metodos estaticos

Estas en el tema de Herencia de clases con metodos estaticos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos. Tengo una clase A que tiene unos métodos estáticos. Tengo una clase B que hereda de A y sobreescribe unos de esos métodos estáticos. ...
  #1 (permalink)  
Antiguo 20/11/2008, 15:55
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Herencia de clases con metodos estaticos

Saludos. Tengo una clase A que tiene unos métodos estáticos. Tengo una clase B que hereda de A y
sobreescribe unos de esos métodos estáticos. El problema es que no consigo llamar desde la clase padre
los métodos que sobreescribe la clase hija.

Vamos con algo de codigo para ver si me doy a entender mejor:

Código PHP:
class A{
    
 public static function 
run(){
    echo(
"<br>Metodo 'Run' definido en: A");
    
self::xxx();
    
self::yyy();
 }
 
 public static function 
xxx(){
    echo(
"<br>Metodo 'xxx' definido en: A");
 }
 
 public static function 
yyy(){
    echo(
"<br>Metodo 'yyy' definido en: A");
 }
 
}

class 
extends A{

 public static function 
xxx(){
    echo(
"<br>Metodo 'xxx' definido en: B");
    
parent::xxx();
 }
 
}

B::run(); 
Sale algo como esto:

Metodo 'Run' definido en: A
Metodo 'xxx' definido en: A
Metodo 'yyy' definido en: A

y yo busco que la salida sea algo como:

Metodo 'Run' definido en: A
Metodo 'xxx' definido en: B
Metodo 'xxx' definido en: A
Metodo 'yyy' definido en: A


Creo que debería cambiar la instrucción 'self' de la clase padre por otra cosa (que desconozco) para que resulte. ¿Cómo podría obtener el resultado que espero?

Gracias de antemano por su colaboración.
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
  #2 (permalink)  
Antiguo 20/11/2008, 16:06
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Herencia de clases con metodos estaticos

Si entendí bien, creo que debería ser al revés, llamar a un método de la clase B, que a su vez llame a los de su padre.

En vez de self podrías poner B, puede que funcione (que no lo sé), pero no tiene ningún sentido!!

Yo creo que lo correcto sería definir un método en B que llame a el método xxx de esa clase y luego al run del parent.

Pero vamos, tampoco visualizo muy bien el escenario, así que puede que no entienda lo que quieres hacer.
  #3 (permalink)  
Antiguo 20/11/2008, 16:18
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
Respuesta: Herencia de clases con metodos estaticos

Recuerda que las funciones estaticas no se heredan, es decir no pasa el scope de parent/child en métodos estaticos por lo que forzosamente vas a tener que poner A:xxx() y vas a tener que definir un método run en B.

Es por eso que por ejemplo no puedes hacer una clase Singleton y heredar de ella ya que las propiedades y métodos estaticos no se heredan.

Saludos
  #4 (permalink)  
Antiguo 20/11/2008, 17:01
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Respuesta: Herencia de clases con metodos estaticos

Bueno el 'escenario' o el porque quiero hacer esta "'locura'", es que quiero hacer una especie de Controlador (MVC) muy generico de consultas paginadas. El cual implemente todas las acciones (filtro, ordenamiendo,reporte, cambio de pagina) utilizando ademas ajax y smarty.

De esta forma para que en las clases hijas solo se parametrize la consulta como tal y en algunos casos se complementen los métodos implementados en la clase generica.

Definí todos los metodos como estáticos ya que consideré que no hiba a necesitar ninguna instancia del controlador (tanto de esa clase generica como de sus hijas).

Entonces no se puede ? mm.. changos... :P

mmm... Aunque creo que podria utilizar metodos normales y utilizar un singleton (ahora que lo mencionan) para que en efecto solo exista una instancia....

O tambien podria reformular todo el "modelo". Algun consejo, guia, solución adicional?

Gracias.
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
  #5 (permalink)  
Antiguo 20/11/2008, 17:46
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: Herencia de clases con metodos estaticos

Usa instancias.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #6 (permalink)  
Antiguo 20/11/2008, 19:10
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
Respuesta: Herencia de clases con metodos estaticos

Una "regla" es que si usas clases estaticas es porque los métodos son independientes y no requiren de funcionalidad de ese tipo, lo que tu estas haciendo requiere de herencia y de una instancia para la comunicación entre métodos por lo que en tu caso si requieres una instancia y heredar.

Saludos.
  #7 (permalink)  
Antiguo 24/11/2008, 09:23
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Respuesta: Herencia de clases con metodos estaticos

Buenas . Dure otro rato dandole vueltas y hasta saque un código que me permitía hacer lo que buscaba:

Código PHP:
class A{
 protected static 
$class_name __CLASS__;
 
 public static function 
iniClassName(){
    
self::$class_name __CLASS__;
 }
    
 public static function 
run(){
    echo(
"<br>Metodo 'Run' definido en: A");    
    
call_user_func( array(self::$class_name"xxx") );
    
call_user_func( array(self::$class_name"yyy") );
 }
 
 public static function 
xxx(){
    echo(
"<br>Metodo 'xxx' definido en: A");
 }
 
 public static function 
yyy(){
    echo(
"<br>Metodo 'yyy' definido en: A");
 }
 
}

class 
extends A{

 public static function 
iniClassName(){
    
self::$class_name __CLASS__;
 }

 public static function 
run(){    
    echo(
"<br>Metodo 'Run' definido en: B");
    
parent::run();
 }

 public static function 
xxx(){
    echo(
"<br>Metodo 'xxx' definido en: B");
    
parent::xxx();
 }
 
}

B::iniClassName();
B::run();

/* Salida:
Metodo 'Run' definido en: B
Metodo 'Run' definido en: A
Metodo 'xxx' definido en: B
Metodo 'xxx' definido en: A
Metodo 'yyy' definido en: A
*/ 
Claro que despues de verlo y aunque funciona, pues estaría agregando complejidad innecesaria algo que puede ser muy simple. Y si además pues hay reglas, si mejor las sigo y no me complico la vida .

Gracias ;)
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
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:22.