抽象类:
#含有抽象方法的类.
abstract class Usb{
abstract public function say();
}
含有抽象方法的类
<?php
//Usb父类
abstract class Usb{
public function load(){
echo "<p>Usb is loading</p>";
}
public function start(){
echo "<p>Usb is starting</p>";
}
abstract public function unload();
}
//子类
class Upan extends Usb{
public function unload(){
echo "<p>Usb is unloading</p>";
}
public function jitui(){
echo '<p>我喜欢鸡腿</p>';
}
}
?>
**
<?php
include 'Person.class.php';
$obj=new Upan();
$obj->load();
$obj->start();
$obj->unload();
$obj->jitui();
?>
**
Usb is loading
Usb is starting
Usb is unloading
我喜欢鸡腿
抽象方法:
#未被实现的方法.
abstract public function start();
**
**
接口:
#只含有抽象方法的类.
interface Usb{
public function say();
}
**
<?php
//Usb父类
interface Usb{
public function load();
public function start();
public function unload();
}
//子类
class Upan implements Usb{
public function load(){
echo "<p>Usb is loading</p>";
}
public function start(){
echo "<p>Usb is starting</p>";
}
public function unload(){
echo "<p>Usb is unloading</p>";
}
public function jitui(){
echo '<p>我喜欢鸡腿</p>';
}
}
?>
**
<?php
include 'Person.class.php';
$obj=new Upan();
$obj->load();
$obj->start();
$obj->unload();
$obj->jitui();
?>
**
Usb is loading
Usb is starting
Usb is unloading
我喜欢鸡腿
接口扩展:
#子接口继承父接口中的所有抽象方法
interface Usb2 extends Usb1{
public function say2();
}
**
<?php
//Usb父类
interface Usb{
public function load();
public function start();
public function unload();
}
interface Usb2 extends Usb{
public function run();
}
//子类
class Upan implements Usb2{
public function load(){
echo "<p>Usb is loading</p>";
}
public function start(){
echo "<p>Usb is starting</p>";
}
public function unload(){
echo "<p>Usb is unloading</p>";
}
public function run(){
echo "<p>Usb is runing</p>";
}
public function jitui(){
echo '<p>我喜欢鸡腿</p>';
}
}
?>
**
<?php
include 'Person.class.php';
$obj=new Upan();
$obj->load();
$obj->start();
$obj->unload();
$obj->jitui();
$obj->run();
?>
**
Usb is loading
Usb is starting
Usb is unloading
我喜欢鸡腿
Usb is runing
多态:
#多种形态
#只有实现了Usb类或接口体内的所有抽象方法的类所生产出来的对象才能使用useUsb函数
function useUsb(Usb $o){
$o->load();
$o->start();
$o->unload();
echo ‘
’;
}
**
<?php
include 'Person.class.php';
$obj=new Upan();
$obj2=new Udisk();
$obj3=new Ucharge();
//t420电脑usb接口只认别符合国际Usb规范的标准设备
function useUsb(Usb $o){
$o->load();
$o->start();
$o->unload();
echo '<hr>';
}
useUsb($obj);
useUsb($obj2);
useUsb($obj3);
?>
多态2
多态2
【示例】例举了通常采用流程控制语句实现不同类的处理。其代码如下所示。
class painter{ //定义油漆工类
public function paintbrush(){ //定义油漆工动作
echo "油漆工正在刷漆!\n";
}
}
class typist{ //定义打字员类
public function typed(){ //定义打字员工作
echo "打字员正在打字!\n";
}
}
function printworking($obj){ //定义处理类
if($obj instanceof painter){ //若对象是油漆工类,则显示油漆工动作
$obj->paintbrush();
}elseif($obj instanceof typist){ //若对象是打字员类,则显示打字员动作
$obj->typed();
}else{ //若非以上类,则显示出错信息
echo "Error: 对象错误!";
}
}
printworking(new painter()); //显示员工工作
printworking(new typist()); //显示员工工作
**
【示例】例举了采用多态的方式改写上例。其代码如下所示。
class employee{//定义员工父类
protected function working(){//定义员工工作,需要在子类的实现
echo "本方法需要在子类中重载!";
}
}
class painter extends employee{//定义油漆工类
public function working(){//实现继承的工作方法
echo "油漆工正在刷漆!\n";
}
}
class typist extends employee{//定义打字员类
public function working(){
echo "打字员正在打字!\n";
}
}
class manager extends employee{//定义经理类
public function working(){
echo "经理正在开会!";
}
}
function printworking($obj){//定义处理方法
if($obj instanceof employee){//若是员工对象,则显示其工作状态
$obj->working();
}else{//否则显示错误信息
echo "Error: 对象错误!";
}
}
printworking(new painter());//显示油漆工的工作
printworking(new typist());//显示打字员的工作
printworking(new manager());//显示经理的工作
分析:在上述程序中,首先定义一个员工基类,并定义一个员工工作状态的方法。然后定义将继承自员工基类的三个员工类:油漆工类、打字员类和经理类。然后定义显示员工工作状态的方法。并在该方法中创建一个“是一”关系,用于判断是否为合法的员工。其结果如下所示。
油漆工正在刷漆!
打字员正在打字!
经理正在开会!
从上例可发现,无论增加多少个员工类,只需要实现自员工父类继承的该员工类和方法。而无须修改显示员工工作状态的方法printworking()。
**