从类引出接口

类: 是某一类事物的抽象,是某类对象的蓝图
比如: 女娲造人时,脑子中关于人的形象,就是人类

如果,女娲决定造人时,同时,形象又没最终定稿时,
她脑子里会有那些支离玻碎的形象呢?

她可能会这么思考:
动物: 吃饭
猴子: 奔跑
猴子: 哭
自己: 思考
小鸟: 飞

我造一种生物,命名为人,应该有如下功能:
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,)
}

*/