abstract 和interface

初学者经常会把 abstract 和 interface 的作用混淆,这里有一篇 abstract 和 interface 的文章,Java版的,十分通俗易懂,不懂java的也很容易看懂
https://mp.weixin.qq.com/s?__biz=MzAxMzQ3NzQ3Nw==&mid=2654251476&idx=4&sn=e66ec48c1d1aa84a50e6a0a6959aa4df&chksm=8061fadeb71673c89fd9ca27f8957766c9286ca3f82c2425edea9d52206847fee0e5bfd35cf4&mpshare=1&scene=1&srcid=0507QOAxDz4FDVwuNkiE7XLG#rd

一句话总结就是:abstract起到模板的作用,可以有属性和方法,interface起到规范方法行为的作用,只能有抽象方法存在,两者都不可以实例化,abstract单继承(视乎语言),interface可以多实现。

下面我说一下interface在我项目中的实现。

我把有列表显示和详情显示的信息抽象成实体(entity),实体列表和实体详情。以用户信息为例(json格式):


2018-05-19_111139.png

ps:这里推荐一个 chrome 插件:JSON-handler,十分好用
项目的其他实体类型还有评论,帖子等等。每一个信息对象,都是一个实体。在项目的 cache 层获取实体列表信息或者详细信息,方法都是类似的,可以把这个概念抽象出一层变成一个 interface(如果实体类型比较多,可以用 trait 封装成复用的方法,最近是个小项目,所以就用 interface 了)。

    /**
     * EntityCache实体接口
     */
    Interface EntityCache {
        /**
         * [entityDetail 根据主键获取实体详情缓存]
         * @param  [type] $id [description]
         * @return [type]     [description]
         */
        public function entityDetail($id);

        /**
         * [entityList 根据主键批量获取实体缓存信息]
         * @param  [Array]  $ids [description]
         * @return [type]      [description]
         */
        public function entityList(Array $ids);

        /**
         * [cacheEntityList 单个或者批量缓存实体信息]
         * @param  [Array] $data [二维实体数组]
         * @return [type]       [description]
         */
        public function cacheEntityList(Array &$data);
    }

这3个抽象方法规定了那些实现了 EntityCache Interface 的类的行为,可以使得团队代码更加规范。

其实在 model 层也可以做这么一个 interface

    /**
     * EntityModule实体接口
     */
    Interface EntityModule {
        /**
         * [entityDetail 根据主键获取实体详情]
         * @return [type] [description]
         */
        public function entityDetail($id);

        /**
         * [entityList 根据主键获取实体列表]
         * @return [type] [description]
         */
        public function entityList(Array $ids);

    }

具体规范视乎团队和业务逻辑而定。
总结:相当一部分phper的编码风格都是非常粗放狂野的,同一个项目中的代码逻辑可能都有几处不同。在养成坏习惯之前意识到规范统一的重要性还是很有必要的,不然以后项目重构的时候真的就火葬场了。

你可能感兴趣的:(abstract 和interface)