VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • PHP 的 interface 有什么用处

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

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

 

基础

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

这是一个基本的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)

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

原因

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

 

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

 

为了解耦!

 

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

 

 

更多高级示例

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

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

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

1
2
3
4
5
interface CacheInterface {
    public function set(string $key, $val);
    public function get(string $key);
    public function delete(string $key);
}

  

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

因此,在不改变缓存系统在项目中的使用方式的情况下更改缓存系统是很容易的。

Symfony 示例

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

1
2
3
4
5
6
7
8
9
use Symfony\Contracts\Cache\CacheInterface;
 
class MyClass {
    private $cache;
    public function __construct(CacheInterface $cache)
    {
        $this->cache = $cache;
    }
}