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 prefixValue
s. 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.