У меня есть абстрактный класс базы данных с именем как:
abstract class database {
protected $value;
}
Я создал еще один абстрактный класс
abstract class my_database extends database {
public function set_value($value) {
$this->value = $value;
}
}
Когда я пытаюсь использовать это:
$my_db = new my_database();
Я получаю ошибку:
Fatal error: Cannot instantiate abstract class my_database in ...
Я пытаюсь сделать следующее: база данных абстрактных классов имеет защищенное значение $, и я хотел бы создать класс-обертку, чтобы иметь возможность изменять защищенное значение (временно).
Как я могу это сделать?
EDIT1: к сожалению ранее, когда я попытался без абстрактной my_database, я получил ошибки:
- abstract methods and must therefore be declared abstract or implemented
- Abstract function cannot contain body
EDIT2:
После полного удаления абстрактного слова из my_database я получил следующую ошибку:
Неустранимая ошибка: класс my_database содержит 32 абстрактных метода и должен
поэтому быть объявленным абстрактным или реализовать оставшиеся методы
Как я могу это исправить?
Классы, определенные как абстрактные, не могут быть созданы, и любой класс, который содержит хотя бы один абстрактный метод, также должен быть абстрактным. Вы можете прочитать об этом в документации PHP здесь: ссылка на сайт
Вот пример.
Есть абстрактный класс (обратите внимание, что абстрактные методы не имеют тела — они не могут иметь тело — это просто подпись):
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Common method. It will be available for all children - they don't have to declare it again.
public function printOut() {
print $this->getValue() . "\n";
}
}
Расширьте свой абстрактный класс таким классом (обратите внимание, что все абстрактные методы ДОЛЖНЫ быть определены в конкретном классе):
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
Затем вы можете создать экземпляр ConcreteClass1:
$class1 = new ConcreteClass1;
Ваш класс не должен быть абстрактным:
class my_database extends database {
public function set_value($value) {
$this->value = $value;
}
}
В ООП абстрактный класс не может быть создан, но может быть расширен.