(1)抽象类和方法
只在父类中声明,在子类中实现,用abstract声明。作用是给子类作规范。
规则:抽象类不能实例化,只能被继承;抽象方法必须被子类方法重写。
创建:
abstract class Computer{
}
抽象类里面的抽象方法必须在子类里面重写,不然会报错。
abstract class Computer{
abstract public function _run();
}
class NoteComputer extends Computer{
//抽象类里面的抽象方法,必须在子类里面重写
public function _run(){
echo '我是子类里的方法';
}
}
抽象类里面的普通方法不需要重写,子类会自动继承下来。
只要类里面有一个抽象方法,那么这个类必须是抽象类,类前面必须加上abstract;反之也是,抽象类里面要有抽象方法,不然里面要加上抽象干嘛呢。
抽象类里面也是可以有正常的字段的。
类只支持单继承,不能实现多继承的。
(2)接口(interface)
接口是一种特殊的抽象类,也是不能实例化的。
接口定义了实现某种类的一般规范,声明了所需的函数和常量,但不指定如何实现。
接口是为了规范实现它的子类,以达到统一的目的。
规则:类里面全部为抽象方法(不需要声明abstract),没有方法体;接口抽象方法必须是public;成员(字段)必须是常量。
定义为:
interface Computer{
const NAME = '联想';
public function _run();
public function _run2();
}
使用接口常量:
echo Computer::NAME;
子类继承接口的说法,叫做实现。
class NoteComputer implements Computer{
public function _run(){
echo '我重写了_run';
}
public function _run2(){
echo '我重写了_run2';
}
}
接口是可以多实现的。
interface Computer{
const NAME = '联想';
public function _run();
public function _run2();
}
interface Computer2{
public function _run3();
}
class NoteComputer implements Computer,Computer2{
public function _run(){
echo '我重写了_run';
}
public function _run2(){
echo '我重写了_run2';
}
public function _run3(){
echo '我重写了_run3';
}
}
如何选择抽象类和接口呢?如果是要继承多个类的方法规范,就用接口;如果要共享一个方法体内容,就用抽象类。
(3)多态
接口的多种不同的实现方式即为多态。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
多态,多种形态。
一个动作由不同的人去执行,而产生不同的效果或者结果,即为多态。
一个人通过不同的状态去执行同一种动作,形成不同的结果,也可以称作为多态。
多态原理,就是类写好啦,不要去修改它,只要在类外的调用参数的更改
<?php
//园丁 剪 修理花草
//理发师剪 理发
//总裁 剪 裁员
// 人 笔记本 运行 win7开机了
// 人 台式机 运行 xp开机了
interface Computer{
public function version();//这个方法表示采用什么电脑
public function work();//这台电脑是怎么运行的
}
//创建一个笔记本类来实现接口
class NoteComputer implements Computer{
public function version(){
echo '笔记本';
}
public function work(){
echo '可以便携式运行win7';
}
}
//创建一个台式机的类来实现接口
class DesktopComputer implements Computer{
public function version(){
echo '台式机';
}
public function work(){
echo '在工作站运行xp';
}
}
class Person{
//创建一个方法来接收电脑
//将它们的对象传递进来就好啦
public function _run($type){
echo '此人的';
$type->version();
$type->work();
}
}
$notecomputer = new NoteComputer();
$desktopcomputer =new DesktopComputer();
$person = new Person();
$person->_run($notecomputer);//这种传递,叫做对象引用的传递
?>