如何在PHP中的非抽象类中声明抽象方法?
class absclass { abstract public function fuc(); }
报告:
PHP致命错误:类absclass包含1个抽象方法,因此必须声明为抽象或实现其余方法(absclass :: fuc)
我想通过实施其余的方法知道这意味着什么?
我认为其余的方法实际上是指你想要定义的抽象方法(在本例中是fuc()
),因为无论如何,可能存在的非抽象方法都是可以的。 这可能是一个错误信息,可以使用更好的措辞:它说,它应该说抽象 。
修复是非常简单的(错误信息的部分是好的):你需要改变这个:
abstract public function fuc();
…正确执行:
public function fuc(){ // Code comes here }
…或者,也可以根据您的需要,使整个class级摘要:
abstract class absclass { abstract public function fuc(); }
请参阅PHP手册中的“类抽象 ”一章:
PHP 5引入了抽象类和方法。 定义为抽象的类可能不会被实例化,并且任何包含至less一个抽象方法的类也必须是抽象的。 定义为抽象的方法只是声明方法的签名 – 他们不能定义实现。
这意味着你要么
abstract class absclass { // mark the entire class as abstract abstract public function fuc(); }
要么
class absclass { public function fuc() { // implement the method body // which means it won't be abstract anymore }; }
抽象类不能直接实例化,但可以包含抽象方法和非抽象方法。
如果扩展抽象类,则必须实现其所有抽象函数,或者使子类抽象化。
你不能重写一个常规的方法并将其抽象化,但是你必须(最终)覆盖所有的抽象方法,并且使它们不是抽象的。
<?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致命错误:类BadDog包含1个抽象方法,因此必须声明为抽象或实现其余方法(Dog :: bark)
如果您注释掉BadDog类,则输出为:
name: Fred gender: female bowowwaoar
如果您尝试直接实例化Dog或PassTheBuckDog,如下所示:
$wrong = new Dog('somma','it'); $bad = new PassTheBuckDog('phamous','monster');
..炸弹与:
PHP致命错误:无法实例化抽象类Dog
或者(如果你注释掉$错误的行)
PHP致命错误:无法实例化抽象类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();
这工作得很好。
抽象关键字用于将类或方法标记为模式。 它与接口类似,但可以包含方法的variables和实现。
对抽象类有很多误解。 这是一个抽象的狗类的例子。 如果一个开发者想为其他开发者创build一些基本的Dog类,或者为了自己的扩展,他会把这个类声明为抽象的。 你不能直接实例化Dog类(没有人可以),但是你可以通过你自己的类来扩展Dog。 SmartDog延伸狗等
所有被Dog类声明为抽象的方法都必须在扩展Dog的每个类中手动实现。
例如,抽象类Dog有一个抽象方法Dog :: Bark()。 但是,所有的狗都有不同的叫声。 因此,在每个Dog子类中,您必须描述具体如何吠叫,因此您必须定义例如SmartDog :: Bark()。
这意味着抽象类的正确性至less有一个抽象方法。 所以你的类要么实现方法(非抽象),要么被声明为抽象的。
你被这个错误信息误导了一点。 在这种情况下,由于在这个类中fuc
正在被定义,所以在这个类中实现它并没有什么意义。 错误是想告诉你一个非抽象类不能有抽象方法。 只要你把一个抽象方法放在一个类的定义中,你也必须把这个类标记为抽象的。
我想在非抽象类(普通类?)中使用抽象方法,并发现可以使用get_parent_class()将方法的内容包装在“if”语句中,如下所示:
if (get_parent_class($this) !== false) {
或者,在操作中(在cmd行的文件中testing:php -f“abstract_method_normal_class_test.php”):
<?php class dad { function dad() { if (get_parent_class($this) !== false) { // implements some logic echo "I'm " , get_class($this) , "\n"; } else { echo "I'm " , get_class($this) , "\n"; } } } class child extends dad { function child() { parent::dad(); } } $foo = new dad(); $bar = new child(); ?> Output: I'm dad I'm child
PHP的get_parent_class()文档