ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 接口 **对于实现我的所有类,看起来都应该像我现在的这个样子** 接口常常用来作为类与类之间的一个协议,接口除了可以包含方法外还能包含常量 接口为抽象而生 ## php和java区别 ~~~ <?php interface mobile { //驱动方法 public function run(); } class plain implements mobile { public function run() { echo '我是飞机'; } public function fly() { echo '飞行'; } } class car implements mobile { public function run() { echo '我是汽车',PHP_EOL; } } class machine { function demo(mobile $a) { //mobile接口是没有这个方法的 $a->fly(); } } $obj = new machine(); $obj->demo(new plain()); //运行成功 $obj->demo(new car()); //运行失败 ~~~ 这段代码不符合接口的语义 ![](https://box.kancloud.cn/3ccdc8cf3afcf6ef3f8ae52388738072_895x582.png) java认为接口就是一个type,即类型,如果你打破了我们之间的契约,你的行为将变得无法控制,那就是非法的.这符合逻辑也符合契约,也符合现实世界,这就起到接口作为规范的作用 php只关心实现我这个方法就行,而不关心接口语义是否正确,php在面向契约编程中不足 php中接口的语义的有限的,使用接口的地方并不多,可淡化为设计文档,起到一个团队基本契约的作用 有些接口是非常有用的,不如spl标准库 **接口不仅规范接口的实现者还规范接口的执行者** 不允许调用本接口中不存在的方法,当然这并不是说类实现了接口,只能实现接口中的方法, 如果针对的是接口而不是具体类,就按接口办事,这样语法规定对接口的使用是有利的,让程序更健壮 为了保证接口语义的正确,通常一个接口的实现类仅仅实现该接口所具有的方法,做到专一,当然这并不是一层不变的