从类引出接口
类: 是某一类事物的抽象,是某类对象的蓝图
比如: 女娲造人时,脑子中关于人的形象,就是人类
如果,女娲决定造人时,同时,形象又没最终定稿时,
她脑子里会有那些支离玻碎的形象呢?
她可能会这么思考:
动物: 吃饭
猴子: 奔跑
猴子: 哭
自己: 思考
小鸟: 飞
我造一种生物,命名为人,应该有如下功能:
eat();
run();
cry();
think();
类如果是一种事物/动物的抽象
那么,接口,则是事物/动物的功能的抽象
即:再把他们的功能各拆成小块,自由组合新的物种
<?php
interface animal {
public function eat();
}
interface monkey {
public function run();
public function cry();
}
interface wisdom {
public function think();
}
interface bird {
public function fly();
}
/*
如上: 我们把每个类中的这种实现的功能拆出来
分析: 如果有一个新生物,实现了eat()+run()+cry()+think()
这种智慧生物,可以叫做人
*/
/*
class Human implements animal,monkey,wisdom {
}
Fatal error: Class Human contains 4 abstract methods and must therefore be declared abstract or implement the remaining methods (animal::eat, monkey::run, monkey::cry, ...) in D:\wamp2\www\PHPoop\502Interface.php on line 52
竟然说我有四个抽象方法
因为接口的方法 本身就是抽象,不要有方法体,也不必加abstract
*/
class Human implements animal,monkey,wisdom {
public function eat() {
echo "吃";
}
public function run() {
echo "走";
}
public function cry() {
echo "哭";
}
public function think() {
echo "思考";
}
}
$lisi = new Human();
$lisi->think();
/**
* 示例
* 根据接口,造一个鸟人
*/
class BirdMan implements animal,monkey,wisdom,bird {
public function eat() {
echo "吃";
}
public function run() {
echo "走";
}
public function cry() {
echo "哭";
}
public function think() {
echo "思考";
}
public function fly() {
echo "hi,我是天使,但是大家都叫我鸟人";
}
}
echo "<br>";
$birdman = new BirdMan();
$birdman->fly();
接口
接口的具体语法:
1.以人类为例,class Human 是人类的草图。
而接口是零件,可以用多种零件组合出一种新的物种来
1.如上,接口本身既是抽象的,内部声明的方法,默认也是抽象的
2.一个类可以一次性实现多个接口
语法用: implements 实现(把我这几个功能实现了)
class ClassName implements interface1,interface2{ }
3.接口也可以继承,用 extends
4.接口是一堆方法的说明,不能加属性
5.接口就是供组装类用的,方法只能是public,封装起来没有意义
6.类必须实现所有接口的方法才能实例化
<?php
interface animal {
public function eat();
}
interface monkey extends animal {
public function run();
public function cry();
}
interface wisdom extends animal {
public function think();
}
interface bird extends animal{
public function fly();
}
//下面有误,monkey继承了animal的接口,因此必须要把eat()方法实现
/*
class Human implements monkey,wisdom {
public function run() {
echo "走";
}
public function cry() {
echo "哭";
}
public function think() {
echo "思考";
}
}*/
class Human implements monkey,wisdom {
public function eat() {
echo "吃";
}
public function run() {
echo "走";
}
public function cry() {
echo "哭";
}
public function think() {
echo "思考";
}
}
?>
做的越多越容易犯错
面向对象的一个观点:
1.做的越多,越容易犯错
抽象类{就定义类模板}--具体子类实现{china,Japan,english}
抽象的数据库类
创业前期:做网站
到底用什么数据库? mysql,Oracle,sqlserver,postgresql
这样: 先开发网站,运行再说
先弄个 mysql 开发着,正式上线了,再换数据库也不迟
引来问题:
换数据库,会不会以前的代码又得重写
答:不必,用抽象类
开发者,开发时,就以db抽象类来开发
<?php
abstract class db {
public abstract function connect($h,$u,$p);
public abstract function query($sql);
public abstract function close();
}
/*
//因为子类实现时, connect 和抽象类的connect参数不一致
class mysql extends db{
public function connect ($h,$p){
return true;
}
public function query ($sql,$conn){
return true;
}
public function close (){
return true;
}
}
*/
/*
下面这个mysql类,严格实现了db抽象类
试想: 不管上线时,真正用什么数据库
我只需要写 一份如下类
class oracle extends db{
}
class mssql extends db{
}
class postsql extends db{
}
业务逻辑层不用改?
为什么不用改?
因为都实现的db抽象来
我开发时,调用方法不清楚的地方,我就可以参考db抽象类
反正子类都是严格实现的抽象类
*/
class mysql extends db{
public function connect ($h,$u,$p){
return true;
}
public function query ($sql){
return true;
}
public function close (){
return true;
}
}
接口就更加抽象了
比如一个社交网站,
关于用户的处理是核心应用
登陆
退出
写信
看信
招呼
更换心情
吃饭
骂人
捣乱
示爱
撩骚
这么多的方法,都是用户的方法,
自然可以写一个user类,全包装起来
但是,用户一次性使用不了这么多方法(登陆,退出)
用户信息类: {登陆,写信,看信,招呼,更换心情,退出}
用户娱乐类:{登陆,骂人,捣乱,示爱,撩骚,退出}
开发网站前,分析出来这么多方法,
但是,不能都装在一个类里,
分成了2个类,甚至更多
作用应用逻辑的开发,这么多的类,这么多的方法,都晕了
<?php
interface userBase {
public function login($u,$p);
public function logout();
}
interface userMsg {
public function writeMsg($to,$title,$content);
public function readMsg($from,$title);
}
interface userFun {
public function spit($to);
public function showLove($to);
}
/*
作为调用者,我不需要了解你的用户信息类,用户娱乐类
我就知道该如何调用这两个类?
因为: 这两个类,都要实现上述接口
通过这个接口,就可以规范开发
*/
/*
下面这个类,和接口声明的参数不一样,就报错,
这样,接口强制统一了类的功能
不管你有几个类,一个类中有几个方法
我只知道,方法都是实现接口的方法
class User implements UserBase {
public function login($u,)
}
*/