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 "我是汽车\r\n";
    }
}
class machine{
    function demo(mobile $a){
        $a->fly();  //mobile接口是没有这个方法的
    }
}
$obj = new machine();
$obj -> demo(new plain()); //运行成功
$obj -> demo(new car()); //运行失败
  • 接口本身并不提供实现,只是提供一个规范。如果我们知道一个类实现了某个接口,那么就知道了可以调用该接口的哪些方法,我们只需要知道这些就够了。
  • PHP中,接口的语义是有限的,使用接口的地方并不多,PHP中接口可以淡化为设计文档,起到一个团队基本契约的作用
interface cache{
    // @describe:缓存管理,项目经理定义接口,技术人员负责实现
    const maxKey = 100000; //最大缓存量
    public function getc($key); //获取缓存
    public function setc($key,$value);//设置缓存
    public function flush(); //清空缓存
}
  • PHP5对面向对象的特性做了许多增强,其中就有一个SPL(标准PHP库)的尝试。SPL中实现一些接口,其中最主要的就是Iterator迭代器接口,通过实现这个接口,就能使对象能够用于foreach结构,从而在使用形式上比较统一
  • DirectoryIterator类之所以拿来就能用,是因为系统已经实现了Iterator接口,所以可以像下面这样使用
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDir()) {
        echo $fileinfo->getFilename(),"\t",$fileinfo->getSize(),PHP_EOL;
    }
}
  • 在对PHP实例对象使用foreach语法时,会检查这个实例有没有实现Iterator接口,如果实现了,就会通过内置方法或使用实现类中的方法模拟foreach语句
  • 接口是对多重继承的一种变相实现,而在讲继承时,我们提到了用来实现混入(Mixin)式的Traits,实际上,Traits可以被视为一种加强型的接口。
trait Hello{
    public function sayHello(){
        echo 'Hello ';
    }
}
trait World{
    public function sayWord(){
        echo 'World';
    }
}
class MyHelloWorld{
    use Hello,World;
    public function sayExclamationMark(){
        echo '!';
    }
}

$o = new MyHelloWorld();
$o -> sayHello();
$o -> sayWord();
$o -> sayExclamationMark();
  • 这里的MyHelloWorld同时实现了两个Traits,从而使其可以分别调用两个Traits里的代码段。从代码中就可以看出,Traits和接口很像,不同的是Traits是可以导入包含代码的接口。从某种意义上来说,Traits和接口都是对“多重继承”的一种变相实现

总结:

  • 接口作为一种规范和契约存在。作为规范,接口应该保证可用性;作为契约,接口应该保证可控性。
  • 接口只是一个声明,一旦使用interface关键字,就应该实现它。可以由程序员实现(外部接口),也可以由系统实现(内部接口)。接口本身什么都不做,但是它可以告诉我们它能做什么。
  • PHP中的接口存在两个不足,一是没有契约限制,二是缺少足够多的内部接口。
  • 接口其实很简单,但是接口的各种应用很灵活,设计模式中也有很大一部分是围绕接口展开的。

参考资料

  • [PHP核心技术与最佳实践]
posted @ 2019-03-27 15:14  高级生命体  阅读(252)  评论(0编辑  收藏  举报