PHP5附带了面向对象的模型,面向对象的模型的一些概念是:类,对象,封装,多态性,抽象类和最终类,以及方法,接口和继承等。在本文中,
我们将讨论Abstract Class及其与PHP中的面向对象技术有关的功能。此外,我们还将通过几个示例学习Abstract Class的实现。
但是,在深入之前,让我们学习如何定义抽象类。
我们可以通过在类名后加上abstract关键字来将类声明为抽象类。定义非常清楚,包含抽象方法的类称为抽象类。在抽象类中定义的抽象方法仅具有名称和参数,而没有其他代码。
无法创建抽象类的对象。相反,我们需要将计算函数定义的子类扩展到子类中抽象方法的主体中,并利用这些子类创建对象。
让我们讨论有关PHP抽象类的一些重要事实:
<?php abstract class base { abstract function printdata(); public function getdata() { echo "nhooo.com"; } } class child extends base{ public function printdata(){ echo "Good morning"; } } $obj = new child(); $obj->getdata(); ?>
nhooo.com
<?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
所有子类都必须定义在父类中标记为抽象的所有方法,所有这些方法都需要使用相同的签名或受限制较少的签名来定义。假设在父类中,如果我们定义了一个受保护的可见性的抽象方法,则在子类的执行中,应使用受保护的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)
声明为抽象的方法仅声明该方法的签名-它们无法在其中定义任何人。尽管可以在非抽象方法中存在身体。
<?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
抽象类可以具有抽象和非抽象方法,但是它必须至少包含一个抽象方法。如果它包含抽象方法,则应将其声明为抽象方法。
<?php class AbstractClass { abstract protected function getValue(); public function printData() { echo " Welcome to nhooo.com"; } } $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)
它不支持多重继承。
<?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
这里,我们有声明超类具有的方法的抽象类test()
和welcome()
和,ClassA和ClassB的和具体的类从一个抽象类延伸。然后,我们尝试创建从ClassA和ClassB扩展的ClassC。从代码中可以明显看出,在welcome()
使用对象ClassC调用方法时,编译器不可能选择必须调用ClassAwelcome()
的welcome()
方法还是ClassB的方法。因此,为了避免此类麻烦,PHP不支持多重继承。
一个抽象类可以扩展另一个抽象类,Abstract类可以提供接口的实现。