一、抽象方法和抽象类
1.抽象方法:一个方法如果没有方法体(没有{},直接分号结束,使用abstrract关键字修饰的方法),即是抽象方法
2.抽象类:如果类中有一个方法是抽象方法,则这个类是抽象类,该类使用abstract来修饰
注意:
1.抽象类中不一定必须有方法
2.抽象类中有抽象方法
3.抽象类不能创建对象
4.其他方面与一般类完全一样
5.抽象类必须有子类,子类将抽象类的抽象方法覆盖,就有方法体了
6.子类必须覆盖全部抽象方法,才能创建对象,如果只实现部分抽象方法,则子类还是抽象类
3.抽象方法的作用:规定了子类必须有(覆盖)这个方法,具体功能交给子类(按自己的功能)实现
4.抽象类的作用:抽象类要求了子类的结构,就是一个规范(程序员不能不写某种方法)
abstract class Person {
abstract function eat();
abstract function sleep();
function walk(){}
};
class Men extends Person {
function eat(){
echo "吃米饭<br>";
}
function sleep(){
echo "睡床<br>";
}
};
class Women extends Person {
function eat(){
echo "吃面<br>";
}
function sleep(){
echo "睡床<br>";
}
};
$s=new Men;
$s->eat();//吃米饭
二、面向对象的接口技术
1.接口是一种特殊的抽象类(有抽象类所有特性)
2.接口与一般抽象类的区别(接口也是一种规范)
a.接口内所有方法必须全是抽象方法
b.接口中属性必须是常量(const声明)
c.接口内权限必须是public(默认即是,不必声明),抽象类可以有protected
d.声明接口不使用class,而是interface
e.接口中的抽象方法不需要abstract特殊声明,因为都是
f.可以用类::访问属性/方法
interface Demo {
const NAME="wo";
function test();
}
3.接口的特性
a.接口可以继承另一个接口(extends),但只有扩展关系,没有覆盖关系
b.可以使用一般类实现接口的*全部方法*(抽象方法必须全部覆盖),即有覆盖关系
c.可以使用抽象类来实现接口的*部分方法*,即有覆盖关系
d.只要是覆盖关系,即使用类/抽象类来实现接口,就要用implements关键字
e.extends:一个类只能有一个父类
f.implements:可以在使用extends继承其他类的同时,进行对接口的实现,可以实现多个接口(一定要先extends,再implements)
g.实现多个接口,以逗号分开多个接口名即可
interface Demo {
const NAME="wo";
function test1();
function test2();
};
interface Test extends Demo {
function test3();
};
class World {
function test4(){
}
};
interface Abc {
function test5();
}
class Fina extends World implements Test,Abc {
function test1(){
echo "test1<br>";
}
function test2(){
echo "test2<br>";
}
function test3(){
echo "test3<br>";
}
function test4(){
echo "test4<br>";
}
function test5(){
echo "test5<br>";
}
};
$p=new Fina;
$p->test1();//test1
$p->test2();//test2
$p->test3();//test3
$p->test4();//test4
$p->test5();//test5
三、多态性(各个子类的形态功能不同)
1.必须有继承关系,父类最好是接口或抽象类,如下为模拟USB接口下鼠标和键盘的多态,以及使用者进行调用的情况
interface USB {
const WIDTH = 12;
const HEIGHT = 3;
function load();
function run();
function stop();
};
class Mouse implements USB {
function load(){
echo "加载鼠标成功!<br>";
}
function run(){
echo "运行鼠标功能!<br>";
}
function stop(){
echo "鼠标工作结束!<br>";
}
};
class Keyboard implements USB {
function load(){
echo "加载键盘成功!<br>";
}
function run(){
echo "运行键盘功能!<br>";
}
function stop(){
echo "键盘工作结束!<br>";
}
};
class Computer {
//只要是继承自USB抽象类的对象,不论什么设备,都执行三个方法
function useUSB(USB $usb){
$usb->load();
$usb->run();
$usb->stop();
}
};
class Workers {
function work(){
$c=new Computer;
$m=new Mouse;
$k=new Keyboard;
$c->useUSB($m);
$c->useUSB($k);
}
};
$w=new Workers;
$w->work();
//加载鼠标成功!
//运行鼠标功能!
//鼠标工作结束!
//加载键盘成功!
//运行键盘功能!
//键盘工作结束!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。