抽象类与抽象方法
php5开始支持抽象类和抽象方法,用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
抽象类不能被实例化
<?php
abstract class Test{
//直接报错 不能实例抽象类
}
$test =new Test();
抽象方法只能声明,不能定义其具体的功能实现(方法体)
abstract class Test{
abstract function t(){}
// Fatal error: Abstract function Test::t() cannot contain body in F:\Work\test.php on line 4
//不能有方法体 也就是 {} 。
}
任何一个类,如果他里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象类。
<?php
class TTT {
function T(){
echo "TTTTTTTTT<br/>";
}
abstract function t1();
/** 这么写是错误的
* 类TTT包含1个抽象方法,因此必须声明为抽象类
* Fatal error: Class TTT contains 1 abstract method and must
* therefore be declared abstract or implement
* the remaining methods (TTT::t1)
*/
}
正确的写法
<?php
abstract class TTT {
function T(){
echo "TTTTTTTTT<br/>";
}
abstract function t1();
//正确写法
}
抽象类的继承
抽象类继承另外一个抽象类时,不用重写其中的抽象方法。
抽象类中,不能重写抽象父类的抽象方法。这样的用法,可以理解为对抽象类的扩展。
<?php
abstract class Test{
abstract function T();
abstract function tt();
}
class T extends Test{
function T(){
echo "我是T";
}
//所有抽象方法必须实现要不报错
function tt()
{
echo "我是tt";
}
}
$t= new T();
$t->T(); //会出两个 我是T 方法名等于类名 相当于__construct PHP7报错 但也出现
继承抽象类的非抽象类必须实现抽象类中的所有抽象方法
<?php
abstract class Test{
abstract function T();
abstract function tt();
}
abstract class test1 extends Test
{
/*
* abstract function T();
* 不能重复定义父类的抽象方法
* Fatal error: Can't inherit abstract function Test::T()
* (previously declared abstract in test1)
*/
abstract function T2();
}
class TTT extends test1{
function T(){
}
function T2(){
}
function tt(){}
} //必须实现所有抽象方法
抽象类的应用
设计模式之模板模式
模板模式又叫模板方法模式,在一个类中定义一个算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
业务场景:银行计算利息(interest
)的时候都是以本金(principal
)乘以利率(interset rate
)得到.利率对每个银行都不一样,而且对于不同的存款方式和本金利率又不同。所以在账户这个类的相关方法里,我们只定义算法骨架,但不具体实现。实现由各个银行的子类来完成,
<?php
abstract class Account{
protected $principal=1000; //本金
protected $interest; //利息
function getInterest(){
//利息=利率*本金
$this->interest=$this->principal * $this->getInterestRate();
return $this->interest;
}
/**
* 获取本金
* @return mixed
*/
public function getPrincipal()
{
return $this->principal;
}
/**
* 获取银行利率 每个银行的利率不易样
* @return mixed
*/
abstract function getInterestRate();
}
class ABC extends Account{
function getInterestRate()
{
echo "我是农行的利率计算方式<br/>";
return 0.5;
}
}
class ICBC extends Account{
function getInterestRate()
{
echo "我是工商银行的利率计算方式<br/>";
return 0.6;
}
}
$lisi =new ABC();
echo $lisi->getInterest();
$zhangsan =new ICBC();
echo $zhangsan->getInterest();