zoukankan      html  css  js  c++  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 "我是汽车
    ";
        }
    }
    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(),"	",$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核心技术与最佳实践]
  • 相关阅读:
    mysql自定义函数多表更新:update_order_relation()
    mysql自定义函数初始化数据:init_data()
    关于tomcat启动错误:At least one JAR was scanned for TLDs yet contained no TLDs
    intellij debug模式提示 Method breakpoints may dramatically slow down debugging
    Linux开机启动流程详细步骤是什么?
    chkconfig 添加脚本开机自启动
    优化SSH配置(一键完成增加若干参数)
    linux目录整理
    linux命令整理
    buffer和cache有什么区别?
  • 原文地址:https://www.cnblogs.com/geniusrun/p/10607722.html
Copyright © 2011-2022 走看看