解释 PHP 中的抽象类。
PHP5 附带了面向对象模型,面向对象模型的一些概念包括:类、对象、封装、多态性、抽象和最终类以及方法、接口和继承等... 在本文中,
我们将讨论抽象类及其与 PHP 中的面向对象技术相关的特性。此外,我们将通过几个示例学习抽象类的实现。
但是在深入研究之前,让我们先学习如何定义抽象类。
我们可以通过在类名后加上 abstract 关键字来将类声明为抽象类。定义非常明确,包含抽象方法的类称为抽象类。抽象类中定义的抽象方法只有名称和参数,没有其他代码。
无法创建抽象类的对象。相反,我们需要将计算函数定义的子类扩展到子类中抽象方法的主体中,并利用这些子类来创建对象。
让我们讨论一下有关 PHP 中抽象类的一些重要事实:
1.抽象类可以具有抽象方法和非抽象方法。
Example:
<?php
abstract class base {
abstract function printdata();
public function getdata() {
echo "Tutorials Point";
}
}
class child extends base{
public function printdata(){
echo "Good morning";
}
}
$obj = new child();
$obj->getdata();
?>
输出:
Tutorials Point
2.无法直接实例化。
示例:
<?php
abstract class AbstractClass{
abstract protected function calculate();
public function adddata() {
echo "Addition done";
}
}
$obj=new AbstractClass();
$obj->adddata();
?>
输出:
Fatal error: Uncaught Error: Cannot instantiate abstract class AbstractClass
3. 相同(或更少限制)的可见性:
所有子类必须定义父类中标记为抽象的所有方法,所有这些方法都需要使用相同签名或更少限制的签名来定义。假设在父类中,如果我们定义一个具有受保护可见性的抽象方法,则在子类执行中应使用受保护的 aorpublic 来定义它,但不能使用 private。
示例:
<?php
abstract class AbstractBaseClass1{
abstract public function addValue();
abstract protected function getValue();
}
class ConcreteClass extends AbstractBaseClass1{
protected function addValue() {
return "ConcreteClass";
}
public function getValue() {
return " Child Class";
}
}
$classobj = new ConcreteClass;
$classobj->addValue();
?>
输出:
Fatal errorAccess level to ConcreteClass::addValue() must be public (as in class AbstractBaseClass1)
4.抽象方法不能包含主体:
声明为抽象的方法只是声明方法的签名 - 它们不能在其中定义任何人。尽管主体可以存在于非抽象方法中。
示例:
<?php
abstract class ParentClass{
abstract protected function printValue(){
return "Good morning";
}
}
class ClassA extends ParentClass{
protected function printValue() {
return "ConcreteClass1";
}
}
$classobj = new ClassA;
$classobj->printValue();
?>
输出:
PHP Fatal error: Abstract function ParentClass::printValue() cannot contain body
5.任何包含至少一个抽象方法的类都必须声明为抽象类:
抽象类可以有抽象方法和非抽象方法,但必须至少包含一个抽象方法。如果它包含抽象方法,则应将其声明为抽象。
示例:
<?php
class AbstractClass {
abstract protected function getValue();
public function printData() {
echo " Welcome to Tutorials Point";
}
}
$obj=new AbstractClass();
$obj->printData();
?>
输出:
PHP Fatal error: Class AbstractClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)
6.抽象类不支持多重继承:
它不支持多重继承。
示例:
<?php
Abstract class SuperClass{
public abstract function test();
protected function welcome(){
echo "Good morning";
}
}
class ClassA extends SuperClass{
public function test(){
echo "Hello";
}
protected function welcome(){
echo "Good afternoon";
}
}
class ClassB extends SuperClass{
public function test(){
echo "Hello";
}
protected function welcome(){
echo "Good evening";
}
}
class ClassC extends ClassA, ClassB{
public function test1(){
$c = new self();
$c->welcome();
}
}
?>
输出:
Error
解释:
这里我们将 SuperClass 声明为具有方法 test() 和 welcome() 的抽象类,并且 ClassA 和 ClassB 以及从抽象类扩展的具体类。然后我们尝试创建从 ClassA 和 ClassB 扩展的 ClassC。从代码中可以看出,在使用对象 ClassC 调用方法 welcome() 时,编译器无法选择是否必须调用 ClassA 的 welcome() 或 ClassB 的 welcome() 方法。因此,为了避免这种复杂性,PHP 不支持多重继承。
注意:
抽象类可以扩展另一个抽象类,抽象类可以提供接口的实现。

