用abstract修饰的类表示这个方法是一个抽象方法。
抽象方法,只有方法的声明部分,没有方法体。
抽象方法没有 {} ,而采用; 结束。
一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。
抽象方法在子类中必须被重写。
下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回$sal 员工的工资。
abstract class User{
protected $sal = 0;
//这里定义的抽象方法.
//注意抽象方法没有方法体,而且方法结束使用 ; 号.
abstract function getSal();
abstract function setSal($sal);
//定义它的__toString 方法.
public function __toString(){
return get_class($this);
}
}
?>
既然User类不能被直接继承,我们写一个 NormalUser类继承自User类。
当我们写成如下代码时,系统会报错。
这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。
abstract class User{
protected $sal = 0;
//这里定义的抽象方法.
//注意抽象方法没有方法体,而且方法结束使用 ; 号.
abstract function getSal();
abstract function setSal($sal);
//定义它的__toString 方法.
public function __toString(){
return get_class($this);
}
}
class NormalUser extends User {
}
?>
程序运行结果:
Fatal error: Class NormalUser contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (User::getSal, User::setSal) in E:\PHPProjects\test.php on line 17
下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。
abstract class User{
protected $sal = 0;
//这里定义的抽象方法.
//注意抽象方法没有方法体,而且方法结束使用 ; 号.
abstract function getSal();
abstract function setSal ($sal);
//定义它的__toString 方法.
public function __toString(){
return get_class($this);
}
}
class NormalUser extends User {
//虽然是空的方法体,但依然是重写了.
function getSal(){}
function setSal($sal){}
}
//这样就不会出错了.
?>
下面19-21行,三种写重写的方式都会报错。
18行,缺少参数。
19行,参数又多了。
20行,参数类型不对
abstract class User{
protected $sal = 0;
//这里定义的抽象方法.
//注意抽象方法没有方法体,而且方法结束使用 ; 号.
abstract function getSal();
abstract function setSal ($sal);
//定义它的__toString 方法.
public function __toString(){
return get_class($this);
}
}
class NormalUser extends User {
//虽然是空的方法体,但依然是重写了.
function getSal(){}
//function setSal(){}
//function setSal($sal1,$sal2){}
function setSal( User $sal){}
}
//这样就不会出错了.
?>
程序运行结果:
Fatal error: Declaration of NormalUser::setSal() must be compatible with that of User::setSal() in E:\PHPProjects\test.php on line 22
一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。
下面这个类不是抽象类,其中定义了一个抽象方法,会报错。
class User{
protected $sal = 0;
//这里定义的抽象方法.
//注意抽象方法没有方法体,而且方法结束使用 ; 号.
abstract function getSal();
abstract function setSal($sal);
//定义它的__toString 方法.
public function __toString(){
return get_class($this);
}
}
//这个类中有两个抽象方法,如果这个类不是抽象的.
//会报错.
?>
程序运行结果:
Fatal error: Class User contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (User::getSal, User::setSal) in E:\PHPProjects\test.php on line 14
延伸阅读
此文章所在专题列表如下: