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

Clases abstractas no me funcionan...y en el manual "Si"

Estas en el tema de Clases abstractas no me funcionan...y en el manual "Si" en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola... estoy practicando el manual de PHP.. ya que por el momento no tengo libros... y ni siquiera copiando el codigo funciona.. jaja Estoy viendo ...
  #1 (permalink)  
Antiguo 22/08/2006, 10:24
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Clases abstractas no me funcionan...y en el manual "Si"

Hola... estoy practicando el manual de PHP.. ya que por el momento no tengo libros... y ni siquiera copiando el codigo funciona.. jaja
Estoy viendo el tema de clases abstractas...
Código PHP:
<?php
abstract class AbstractClass
{
   
// Force Extending class to define this method
   
abstract protected function getValue();
   abstract protected function 
prefixValue($prefix);

   
// Common method
   
public function printOut() {
       print 
$this->getValue() . "\n";
   }
}

class 
ConcreteClass1 extends AbstractClass
{
   protected function 
getValue() {
       return 
"ConcreteClass1";
   }
  
   public function 
prefixValues($prefix) {
       return 
"{$prefix}ConcreteClass1";
   }
}

class 
ConcreteClass2 extends AbstractClass
{
   protected function 
getValue() {
       return 
"ConcreteClass2";
   }

   public function 
prefixValue($prefix) {
       return 
"{$prefix}ConcreteClass2";
   }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo 
$class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo 
$class2->prefixValue('FOO_') ."\n";
?>
Al ejecutarlo me sale:
Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::prefixValue) in c:\Inetpub\wwwroot\PHP\abstract2.php on line 23
A que se debe el error?
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #2 (permalink)  
Antiguo 22/08/2006, 10:54
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
Segun tu "implementacion" en la clase abstracta defines 2 metodos protected, pero cuando extiendes a tus clases, una la haces public y la otra protected, creo deben de tener la misma "firma" si no el compiler de php la lee como otra propiedad diferente.

saludos!
  #3 (permalink)  
Antiguo 22/08/2006, 11:01
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Ya habia hecho eso que mencionas... las que cambie a protected ... y de todos modos no funciona..
Lo que se me hace raro es que la copie tal cual viene en el manual y me marca error... :S
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #4 (permalink)  
Antiguo 22/08/2006, 11:25
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
No es solo cambiarlo, cuando tu lo cambias, ya no es posible acceder desde afuera al metodo pues los metodos protected solo pueden ser accesados dentro de la clase, o de las clases hijas.
  #5 (permalink)  
Antiguo 22/08/2006, 16:40
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Entonces cual es la solucion?
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #6 (permalink)  
Antiguo 22/08/2006, 16:48
 
Fecha de Ingreso: agosto-2006
Mensajes: 2
Antigüedad: 17 años, 8 meses
Puntos: 0
Error de Tipeo

Hola mi estimado B**

Estuve revisando tu código, y al parecer todo esta ok salvo por el método
Código PHP:
public function prefixValues($prefix
de la clase ConcreteClass1 que asumo es la implementacion del método abstracto
Código PHP:
abstract protected function prefixValue($prefix); 
de la clase AbstractClass, si te fijas con cuidado, los nombres no coinciden por lo que el intérprete de PHP indica que tienes una clase abstracta sin implmentar, con repecto a la "firma" del método no hay ningún problema en usar public, protected o private.

Saludos
Jucem

Pdta: Si esto aún asi no funciona me avisas para revisar más en profundidad el código.
  #7 (permalink)  
Antiguo 22/08/2006, 17:14
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Cambie el nombre ....y me sigue dando el error:
Fatal error: Class ConcreteClass1 contains 1 abstract methods and must therefore be declared abstract (AbstractClass::prefixValue) in C:\Servidor\WEB\php\POO\abstract.php on line 23
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #8 (permalink)  
Antiguo 22/08/2006, 20:56
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Tal como dice Jucem, fijate en esta línea dentro de ConcreteClass1:
Código PHP:
public function prefixValues($prefix) { 
El método que definitste en la clase abstracta es prefixValue y no prefixValues. Al encontrar un método abstracto de la clase padre que no era redefinido en la clase hija se te obligaba a declarar la clase ConcreteClass1 también como abstracta.

Tu código queda así:
Código PHP:
<?php 
abstract class AbstractClass 

   
// Force Extending class to define this method 
   
abstract protected function getValue(); 
   abstract protected function 
prefixValue($prefix); 

   
// Common method 
   
public function printOut() { 
       print 
$this->getValue() . "\n"
   } 


class 
ConcreteClass1 extends AbstractClass 

   protected function 
getValue() { 
       return 
"ConcreteClass1"
   } 
   
   public function 
prefixValue($prefix) { 
       return 
"{$prefix}ConcreteClass1"
   } 


class 
ConcreteClass2 extends AbstractClass 

   protected function 
getValue() { 
       return 
"ConcreteClass2"
   } 

   public function 
prefixValue($prefix) { 
       return 
"{$prefix}ConcreteClass2"
   } 


$class1 = new ConcreteClass1
$class1->printOut(); 
echo 
$class1->prefixValue('FOO_') ."\n"

$class2 = new ConcreteClass2
$class2->printOut(); 
echo 
$class2->prefixValue('FOO_') ."\n"
?>
Saludos.
__________________
R4DS en español | R4DS en inglés
  #9 (permalink)  
Antiguo 22/08/2006, 22:06
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Si .. ya funciona .. lo que pasa que cambie los nombres de los metodos de las clases hijas... les puse "S " al final.. y me olvide de la clase padre.. ja.
Bueno.. espero ya no me pase eso... mas bien.. que el manual de PHP no se equivoquen.. ya que copie y pegue el codigo..
Gracias a todos
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
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 10:50.