एक सार वर्ग सीधे instantiated नहीं किया जा सकता है, लेकिन यह दोनों सार और गैर सार तरीकों हो सकते हैं।
यदि आप एक अमूर्त वर्ग का विस्तार करते हैं, तो आपको या तो अपने सभी अमूर्त कार्यों को लागू करना होगा, या उप-वर्ग सार बनाना होगा।
आप एक नियमित विधि को ओवरराइड नहीं कर सकते हैं और इसे सार बना सकते हैं, लेकिन आपको (अंततः) सभी अमूर्त तरीकों को ओवरराइड करना होगा और उन्हें गैर-सारणी बनाना होगा।
<?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');
..it बम के साथ:
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