如何在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()文档