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

Bug

Estas en el tema de Bug en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Código: class a { var $variable; function estatica() { if (isset($this)) { return $this->otra(); } } function otra() { return 'Hola mundo.'; } } class ...
  #1 (permalink)  
Antiguo 06/08/2007, 05:49
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años, 1 mes
Puntos: 11
Bug

Código:
class a {
    var $variable;
    
   function estatica() {
      if (isset($this)) {
         return $this->otra();
      }
   }
    
   function otra() {
      return 'Hola mundo.';
   }
}

class b {
    
   function instanciada() {
      return a::estatica();
   }
}

$b = new b();
echo $b->instanciada();

El código de arriba es para PHP4, sé que muchos dirán "pasate a PHP5" pero igual veamos esto.

El código instancia una clase "b" y llama a un método de esta clase, ese método llama de forma estática a un método de la clase "a", dicho método hace una llamada a función a otro método usando una referencia $this... Obviamente esto no funcionaría porque el objeto no ha sido instanciado ($this no debería existir), pero curiosamente PHP4 encuentra instanciada la variable $this pero al hace la llamada a función
return $this->otra(); se genera el siguiente error:

Fatal error: Call to undefined function: otra() in PHPDocument1 on line 9.


Aparentemente no encuentra el método otra() en la clase "b", dado a que $this está haciendo referencia al objeto instanciado $b........
  #2 (permalink)  
Antiguo 06/08/2007, 08:18
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
Re: Bug

Cambia:
Código PHP:
if (isset($this)) { 
Por:
Código PHP:
if (isset($this) && is_object$this ) && getclass$this ) == "a" ) { 
Recuerda que en PHP4 el manejo de POO esta muy limitado y en algunas partes mal implementado (como el poder llamar a una funcion de manera estatica o al instanciarla)

Saludos.
  #3 (permalink)  
Antiguo 06/08/2007, 08:22
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Bug

bug... No es bug, te recomiendo leer sobre OOP PHP.
No puedes tener métodos ni propiedades de la clase dentro de un método estático.
  #4 (permalink)  
Antiguo 06/08/2007, 09:47
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años, 1 mes
Puntos: 11
Re: Bug

A lo que voy es a esto:

Un método llamado de forma estática accede a una variable del objeto instanciado que hizo la llamada a función directamente con $this.

Para métodos llamados de forma estática "$this" no debería estar disponible. Un "Undefined variable $this" vendría bien, o mejor aún, como el mismo error en PHP5: "$this no puede ser referenciado desde una llamada estática"


Cita:
bug... No es bug, te recomiendo leer sobre OOP PHP.
No puedes tener métodos ni propiedades de la clase dentro de un método estático.
Efectivamente, no puede haber referencias a propiedades dentro de un método estático, es lo que trato de explicar.


Saludos.

PD: Por si no se entendió el código, el isset() lo quise usar de parche por si no estaba instanciado el objeto y me encontré con el error :s
  #5 (permalink)  
Antiguo 06/08/2007, 09:51
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
Re: Bug

Como te comento PHP4 tiene demasiado mal implementado el modelo de OOP, por eso no es un "bug" y es por eso que se creo PHP5, para desde 0 crear un modelo OOP eficiente y mas adaptado a lo que son las reglas de programacion.

PHP4 no distingue entre metodos llamados de forma estatica o dinamica, y por ahi viene tu problema.

Saludos.
  #6 (permalink)  
Antiguo 06/08/2007, 11:25
 
Fecha de Ingreso: febrero-2006
Mensajes: 34
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: Bug

Para usar clases estaticas en PHP4 abria que hacer lo siguiente
Código:
class a {
    
   function estatica() {
         return a::otra();
   }
    
   function otra() {
      return 'Hola mundo.';
   }
}

class b {
    
   function instanciada() {
      return a::estatica();
   }
}

$b = new b();
echo $b->instanciada();

Saludos
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 07:43.