什么是在PHP中的抽象类?

什么是在PHP中的抽象类? 哪里可以使用?

抽象类是一个至less包含一个抽象方法的类,它是一个没有任何实际代码的方法,只是名称和参数,而且被标记为“抽象”。

这样做的目的是提供一种模板来inheritance和强制inheritance类实现抽象方法。

因此抽象类是普通类和纯粹接口之间的东西。 接口也是抽象类的一个特例,其中所有方法都是抽象的。

请参阅PHP手册的这一部分以作进一步参考。

抽象类是包含一个或多个抽象方法的类。 抽象方法是声明的方法,但不包含实现。 抽象类可能不会被实例化,并且需要子类为抽象方法提供实现。

1.不能实例化抽象类 :定义为抽象的类可能不会被实例化,并且任何包含至less一个抽象方法的类也必须是抽象的。

示例如下:

abstract class AbstractClass { abstract protected function getValue(); abstract protected function prefixValue($prefix); public function printOut() { echo "Hello how are you?"; } } $obj=new AbstractClass(); $obj->printOut(); //Fatal error: Cannot instantiate abstract class AbstractClass 

2.任何包含至less一个抽象方法的类也必须是抽象的 :抽象类可以具有抽象方法和非抽象方法,但是它必须至less包含一个抽象方法。 如果一个类至less有一个抽象方法,那么该类必须声明为抽象的。

注意:特征支持使用抽象方法,以便对参展类施加要求。

示例如下:

 class Non_Abstract_Class { abstract protected function getValue(); public function printOut() { echo "Hello how are you?"; } } $obj=new Non_Abstract_Class(); $obj->printOut(); //Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue) 

3.抽象方法不能包含body :定义为抽象的方法只是声明方法的签名 – 他们不能定义实现。 但是一个非抽象的方法可以定义实现。

 abstract class AbstractClass { abstract protected function getValue(){ return "Hello how are you?"; } public function printOut() { echo $this->getValue() . "\n"; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') ."\n"; //Fatal error: Abstract function AbstractClass::getValue() cannot contain body 

4.当从一个抽象类inheritance时,在父类的声明中标记为抽象的所有方法都必须由子类定义 :如果inheritance抽象类,则必须为其中的所有抽象方法提供实现。

 abstract class AbstractClass { // Force Extending class to define this method abstract protected function getValue(); // Common method public function printOut() { print $this->getValue() . "<br/>"; } } class ConcreteClass1 extends AbstractClass { public function printOut() { echo "dhairya"; } } $class1 = new ConcreteClass1; $class1->printOut(); //Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue) 

5.相同(或更less限制)的可见性 :当从一个抽象类inheritance时,在父类的声明中标记为抽象的所有方法必须由子定义; 另外,这些方法必须定义为具有相同(或更less限制)的可见性。 例如,如果将抽象方法定义为受保护的,则必须将函数实现定义为protected或public,而不是private。

请注意,抽象方法不应该是私有的。

 abstract class AbstractClass { abstract public function getValue(); abstract protected function prefixValue($prefix); public function printOut() { print $this->getValue(); } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') ."<br/>"; //Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass) 

6.抽象方法的签名必须匹配 :当从一个抽象类inheritance时,在父类的声明中标记为abstract的所有方法都必须由child定义;方法的签名必须匹配,即types提示和所需的数量参数必须相同。 例如,如果子类定义了一个可选参数,而抽象方法的签名没有,那么签名中就没有冲突。

 abstract class AbstractClass { abstract protected function prefixName($name); } class ConcreteClass extends AbstractClass { public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; } } $class = new ConcreteClass; echo $class->prefixName("Pacman"), "<br/>"; echo $class->prefixName("Pacwoman"), "<br/>"; //output: Mr. Pacman // Mrs. Pacwoman 

7.抽象类不支持多重inheritance :Abstract类可以扩展另一个抽象类,Abstract类可以提供接口的实现,但不支持多重inheritance。

 interface MyInterface{ public function foo(); public function bar(); } abstract class MyAbstract1{ abstract public function baz(); } abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{ public function foo(){ echo "foo"; } public function bar(){ echo "bar"; } public function baz(){ echo "baz"; } } class MyClass extends MyAbstract2{ } $obj=new MyClass; $obj->foo(); $obj->bar(); $obj->baz(); //output: foobarbaz 

注意:请注意您的代码中的类别的sorting或定位可能会影响解释器,并可能导致致命错误。 所以,当使用多个抽象级别时,请注意源代码中类的位置。

下面的例子会导致致命错误:未find类“马”

 class cart extends horse { public function get_breed() { return "Wood"; } } abstract class horse extends animal { public function get_breed() { return "Jersey"; } } abstract class animal { public abstract function get_breed(); } $cart = new cart(); print($cart->get_breed()); 

抽象类是只由程序员部分实现的类。 它可能包含一个或多个抽象方法。 抽象方法只是一个函数定义,用来告诉程序员该方法必须在子类中实现。

这里有很好的解释。

链接: Php和oops中的抽象类

  • 抽象类只包含声明方法的签名,不能定义实现。
  • 抽象类是使用关键字abstract定义的。
  • 抽象类不可能实现多重inheritance
  • 最新版本的PHP 5引入了抽象类和方法。
  • 定义为抽象类,我们无法创build对象(可能未实例化)

http://www.codingslover.com/2015/07/abstract-class-in-php.html

抽象类
1.包含一个抽象方法
2.不能直接初始化
3.不能创build抽象类的对象
4.仅用于inheritance目的

抽象方法
1.不能包含一个身体
2.不能被定义为私人
3.子类必须定义在抽象类中声明的方法

示例代码:

 abstract class A { public function test1() { echo 'Hello World'; } abstract protected function f1(); abstract public function f2(); protected function test2(){ echo 'Hello World test'; } } class B extends A { public $a = 'India'; public function f1() { echo "F1 Method Call"; } public function f2() { echo "F2 Method Call"; } } $b = new B(); echo $b->test1() . "<br/>"; echo $b->a . "<br/>"; echo $b->test2() . "<br/>"; echo $b->f1() . "<br/>"; echo $b->f2() . "<br/>"; 

输出:

 Hello World India Hello World test F1 Method Call F2 Method Call