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

lio con herencia en php4

Estas en el tema de lio con herencia en php4 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola Tengo un gran lío con la herencia en php4 (el que soporta mi server) concretamente con 3 clases, paso a detallaros el problema a ...
  #1 (permalink)  
Antiguo 24/07/2006, 05:49
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
lio con herencia en php4

Hola

Tengo un gran lío con la herencia en php4 (el que soporta mi server) concretamente con 3 clases, paso a detallaros el problema a ver si me podeis ayudar.

Tengo la clase control, la clase bd y la clase noticia

control es la clase "padre" y es asi

Código PHP:
class control{
var 
$BD;

//constructor que conecta con la base de datos y almacena el objeto BD en el atributo BD de la clase control
function control(){
include(
"bd.php");
$this->BD= new bd();
}

Hasta aqui todo bien

ahora pretendo usar BD en la clase noticia y no me deja. os dejo noticia para que lo veais.

Código PHP:
class noticia extends control {

var 
$titulo;

function 
noticia ($id){
$query ="SELECT * FROM noticias LIMIT 1"
$this->bd->consulta($query);
}

Código PHP:
$noticia= new noticia(64); 
Bueno pues cuando instancio la el objeto en mi archivo cursos.php me da el siguiente error:

fatal error: Call to a member function consulta() on a non-object in D:\apachefriends\xampp\htdocs\nexxo2\class\noticia .php on line 49

¿Me podeis ayudar?
Gracias
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa

Última edición por Lord of freaks; 24/07/2006 a las 08:20
  #2 (permalink)  
Antiguo 24/07/2006, 07:38
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Bueno... no se ve lo que pasa con la clase noticia cuando instancias un curso.

Igual, recuerda que PHP es case-sensitive. Así que si tu variable es $BD, no será igual que $db.

$this->BD= new bd();
...
$this->bd->consulta($query);

Tampoco sé si PHP4 soportaba más de un operador -> en la misma sentencia. Si no, deberás hacerlo en dos partes.

Saludos
  #3 (permalink)  
Antiguo 24/07/2006, 08:13
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
JPinedo tiene razon solo posteo para que sepan, PHP4 SI soporta hacer consultas:

$this->var->metodo()

lo que no soporta es esto:
$this->metodo()->otroMetodo();

ya que primero tienes que hacer esto:
$temp = $this->metodo();
$temp->otroMetodo();
  #4 (permalink)  
Antiguo 24/07/2006, 08:26
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
Creo que medio tengo la respuesta el caso es que lo que pretendo es invocar un método de un objeto (bd) que es el atributo de la clase padre (control) desde una clase hija (noticia)

He logrado hacer algo pero me falta rematarlo a ver si entre todos... :)

Código PHP:
// haciendo esto desde la el constructor de la clase noticia acceso a la clase
// padre (control) 

parent::consulta($query);

// pero me da error como es lógico porque lo que necesito es algo como

parent::bd->consulta($query);

// para acceder a la propiedad bd del objeto control y asi a sus métodos
// (consulta en este caso) 
Me podeis ayudar
Un saludo y muchas gracias
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
  #5 (permalink)  
Antiguo 24/07/2006, 08:29
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
Que problema te da con usar:

$this->bd->consulta( $query );

no nescesitas usar parent:: porque no estas reescribiendo la variable.
  #6 (permalink)  
Antiguo 24/07/2006, 08:30
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
Me da el error

Fatal error: Call to a member function consulta() on a non-object in D:\apachefriends\xampp\htdocs\nexxo2\class\noticia .php on line 50
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
  #7 (permalink)  
Antiguo 24/07/2006, 08:31
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
Estas seguro de estar usando bien el nombre? ve el post de JPinedo

$this->BD NO es lo mismo que $this->bd

asi que si usas BD o bd, usa el correcto o te da ese error.
  #8 (permalink)  
Antiguo 24/07/2006, 08:35
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
si es correcto

Probe a quitar las líneas de la base de datos y dar un print_r a los objetos y mira

control Object
(
[bd] => bd Object
(
[servidor] => localhost
[nombreBD] => bd
[nombreDeUsuario] => root
[contrasena] => 1234
[enlace] =>
[resultado] =>
[consulta] =>
)

[title] =>
[metaKeywords] =>
[metaDescription] =>
)
curso Object
(
[id] =>
[curso] =>
[horas] =>
[centro] =>
[plan] =>
[observaciones] =>
[modalidad] =>
[gratuidad] =>
[colectivo] =>
[inicio] =>
[fin] =>
[bd] =>
[title] =>
[metaKeywords] =>
[metaDescription] =>
)

Da la impresión de que cuando hereda bd pierde el objeto que almacena
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
  #9 (permalink)  
Antiguo 24/07/2006, 08:45
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
creo ya se porque es el error, y es porque desde el constructor de noticia tienes que llamar al constructor de la clase padre, esto lo haces asi:
Código PHP:
class noticia extends control {
     function 
noticia$id ) {
            
$this->control();
            
$query ="SELECT * FROM noticias LIMIT 1"
            
$this->BD->consulta($query);
     }

Esto es porque en tu constructor control creas el objeto DB
  #10 (permalink)  
Antiguo 24/07/2006, 08:51
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
Pozi amparo efectivamete era eso tengo que reconstruir control para que se funcione bd con toda su funcionalidad

Una pena la verdad pero a ver como lo puedo mejorar porque lo que quería era ahorra y así me da que no ahorro nada construyendo y reconstruyendo control la verdad.

Un saludo y muchísimas gracias por la respuestas y la velocidad
Para lo que necesites siempre
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
  #11 (permalink)  
Antiguo 24/07/2006, 12:58
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
A ver... parece que tu querías utilizar la clase "control" para que maneje una sola instancia de "bd"... y que todos los hijos de "control" usarían esa misma instancia.

Bien pensado!... pero tal como lo estás haciendo no funcionará (aunque estás bastante cerca). Para asegurarte de que sólo manejas una instancia de "bd" utiliza el patrón Singleton.

Webstudio dejó aquí una implementación del patrón para PHP4. Aunque hay un error en esa clase que se explica aquí.

Verás que es muy simple.

saludos
  #12 (permalink)  
Antiguo 25/07/2006, 02:13
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
funciono perfecto muchísimas gracias porque era justo lo que necesitaba además creo que gracias a esto solucionaré en problema de los títulos dinámicos en las web modulares.

Un saludo y un millón de gracias
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
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 12:59.