• PHP 的 interface 有什么用处?


    确实,PHP 接口是有它的目的的。

    它们是契约,是给其他开发人员的说明手册。然而,还是很难理解接口有什么用。

    基础

    接口是抽象的类,无法直接实例化,但是可被实现。

    这是一个基本的例子

    interface MyInterface {
        public function setName(string $name);
        public function getName();
    }
    
    class MyClass implements MyInterface {
        private $name; 
    
        public function setName(string $name) { 
            $this->name = $name; 
        }
    
        public function getName() {
            return $this->name; 
        }
    }
    

      

    MyClass 必须实现 setName() 和 getName() 方法。如果你不照做,你就会遇到致命错误。

    Fatal error: Class MyClass contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MyInterface::setName, MyInterface::getName)

    此外,接口中定义的方法的访问性必须为公开的,并且接口中不能定义类成员。

    原因

    开发者使用接口来描述一个或者一组类的共同行为。

    但是为什么只负责封装实现而不负责处理每个类的详细信息呢?

    为了解耦!

    接口允许你在不更改详细信息的情况下更改实现,也就是你使用此实现的方式。

    更多高级示例

    任何缓存系统都需要以下功能

    • 存储 / 设置缓存中的内容
    • 获取缓存中的内容
    • 删除缓存中的内容

    基于此,我们可以创建如下的缓存接口

    interface CacheInterface {
        public function set(string $key, $val);
        public function get(string $key);
        public function delete(string $key);
    }
    

      

    以这种方式,就可以让开发者知道需要实现缓存接口,具体怎么实现,我们不需要知道。结果就是我们可以在不修改使用方式的情况下方便地切换缓存系统

    As a result, it's easy to change the caching system without changing the way it's used in the project.

    Symfony 示例

    我们来看刚才例子的具体应用。对于 Symfony 而言,如果你想要实现任何缓存系统,最佳实践就是按照下面的方式来做

    use SymfonyContractsCacheCacheInterface;
    
    class MyClass {
        private $cache;
        public function __construct(CacheInterface $cache)
        {
            $this->cache = $cache;
        }
    }
    

      

    通过依赖注入,将缓存接口注入到我们的类中。下次我们修改缓存系统时,MyClass 类不需要做任何的改变。

     

    多实现 VS 多继承

    PHP 不支持多继承,下面这种方式是不可能的

    class MyClass extends ClassX, ClassY {}

    之所以不允许这样做部分原因是由于 Diamond 问题.

    不过,你可以这么做

    class ClassY extends ClassX {}
    class MyClass extends ClassY {}
    

      

    但是 ClassX 和 ClassY 可能处理不同的事情,因此使用继承没有任何意义。

    如果你想要执行多种行为,那么你可以多个接口

    class MyClass implements InterfaceX, InterfaceY {}
    

      

    换句话说,你可以让一些类共享一部分功能而不是共享一个父类。

    总结

    PHP 接口是类的方法模板,这对于解耦实现及使用是非常有帮助的。

    当你需要保持灵活性并确保所有开发人员都遵循一组规则时,此功能特别有用。

     

    更多学习内容请访问:

    八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

  • 相关阅读:
    31天重构学习笔记28. 为布尔方法命名
    .NET 技术社区之我见(中文篇)
    31天重构学习笔记26. 避免双重否定
    31天重构学习笔记25. 引入契约式设计
    31天重构学习笔记20. 提取子类
    31天重构学习笔记18. 使用条件判断代替异常
    31天重构学习笔记19. 提取工厂类
    31天重构学习笔记24. 分解复杂判断
    31天重构学习笔记23. 引入参数对象
    31天重构学习笔记17. 提取父类
  • 原文地址:https://www.cnblogs.com/a609251438/p/12561712.html
Copyright © 2020-2023  润新知