Абстрактный класс не может быть непосредственно экземпляр, но он может содержать как абстрактные и не абстрактные методы.
Если вы расширяете абстрактный класс, вам нужно либо реализовать все его абстрактные функции, либо сделать абзац подкласса.
Вы не можете переопределить обычный метод и сделать его абстрактным, но вы должны (в конечном итоге) переопределить все абстрактные методы и сделать их не абстрактными.
<?php
abstract class Dog {
private $name = null;
private $gender = null;
public function __construct($name, $gender) {
$this->name = $name;
$this->gender = $gender;
}
public function getName() {return $this->name;}
public function setName($name) {$this->name = $name;}
public function getGender() {return $this->gender;}
public function setGender($gender) {$this->gender = $gender;}
abstract public function bark();
}
// non-abstract class inheritting from an abstract class - this one has to implement all inherited abstract methods.
class Daschund extends Dog {
public function bark() {
print "bowowwaoar" . PHP_EOL;
}
}
// this class causes a compilation error, because it fails to implement bark().
class BadDog extends Dog {
// boom! where's bark() ?
}
// this one succeeds in compiling,
// it's passing the buck of implementing it's inheritted abstract methods on to sub classes.
abstract class PassTheBuckDog extends Dog {
// no boom. only non-abstract subclasses have to bark().
}
$dog = new Daschund('Fred', 'male');
$dog->setGender('female');
print "name: " . $dog->getName() . PHP_EOL;
print "gender: ". $dog->getGender() . PHP_EOL;
$dog->bark();
?>
Эта программа бомбы с:
PHP Fatal error: Class BadDog contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Dog::bark)
Если закомментировать класс BadDog, то выход:
name: Fred
gender: female
bowowwaoar
Если вы пытаетесь создать экземпляр собаки или PassTheBuckDog непосредственно , например:
$wrong = new Dog('somma','it');
$bad = new PassTheBuckDog('phamous','monster');
..Это бомбы с:
PHP Fatal error: Cannot instantiate abstract class Dog
или (если вы закомментировать $ неправильную линию)
PHP Fatal error: Cannot instantiate abstract class PassTheBuckDog
Вы можете, однако, вызвать статическую функцию абстрактного класса:
abstract class Dog {
..
public static function getBarker($classname, $name, $gender) {
return new $classname($name, $gender);
}
..
}
..
$other_dog = Dog::getBarker('Daschund', 'Wilma', 'female');
$other_dog->bark();
Это работает просто отлично.
Он был уже объявлен в абстрактном классе предка вы inher но не реализованы. Теперь вам нужно реализовать его, а не объявлять. Как только все абстрактные (объявленные без реализаций) методы реализованы, класс становится не абстрактным и может иметь экземпляры. – Gherman