PHP中接口的用途是什么?

What is the purpose of interfaces in php?

如果我在PHP中定义了一个接口,以及一个创建该接口实例的工厂类,有没有任何方法可以强制客户端代码只使用接口而不使用底层的具体类?据我所知,客户机实际上也能够使用基础类中的任何公共函数/字段。

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
interface IMyInterface
{
    public function doSomething();
}
?>

<?php
class ConcreteImplOfMyInterface implements IMyInterface
{
    const NotPartOfInterface = 'youcantseeme';

    public function doSomething()
    {
    }
}
?>

<?php
class MyInterfaceFactory
{
    public static function createMyInterface()
    {
        return new ConcreteImplOfMyInterface();
    }
}
?>

<?php
function client()
{
    $myInterface = MyInterfaceFactory::createMyInterface();
    return $myInterface::NotPartOfInterface;
}
?>

这就是为什么接口在PHP中很好的原因:

1
2
3
4
5
6
7
interface Printable{
    public function display();
}

function display(Printable $obj){
    $obj->display();
}

它要求进入该函数的任何变量都是可打印的实例。因此,如果您想使用该函数,就强制任何使用代码的人实现该接口。

php 5.1 http://php.net/manual/en/language.oop5.typehinting.php

如果要确保其他人不能使用某个类的特定方法或变量,则需要将这些方法和变量定义为private。这将使它们不能被除特定类之外的任何其他类使用。(即使扩展类的类也不能使用它们)


您所要求的只有静态类型的语言才能实现,而且由于PHP是动态类型的,所以简短的答案是它不可能实现。

例如,在Java中,EDCOX1(3)可以返回一个EDCOX1×4,并且这个对象上唯一可能的操作是在接口本身中定义的操作。当然,对象实际上是ConcreteImplOfMyInterface类型,所以您可以将它强制转换为该类型以访问其他字段/方法。

PHP没有声明的类型,所以从函数返回的只是一个"变量"——它没有类型。因为没有类型,所以所有的字段/方法查找都是动态的,所以对象中的任何"存在"都可以被访问。

在某种程度上,在诸如php之类的语言中,接口的使用确实有一定的限制——任何实现接口的类都必须实现它的所有方法,但是由于一开始就不能保证函数可以返回什么,所以根本就不能保证任何东西。最好的方法是使用instanceof检查未知变量是否实现给定的接口。


因为PHP是一种动态语言,所以它意味着对类成员等的所有访问都将在运行时得到解决。这意味着如果我有调用$foo->bar()的代码,并且我在$foo中得到了名为bar()的方法的对象,那么即使它可能不是我打算调用的方法bar(),但其他某个对象上的某个方法(碰巧命名为相同的方法)也会被调用。

但是,也就是说,您可以通过使用类型化参数让函数只接受特定对象来提供一些保护:

1
2
3
function doingSomething(IMyInterface $foo) {
  $foo->doSomething();
}

但是,您仍然不能禁止任何人实现imyinterface,然后编写接受imyinterface但将其作为某个更高级别的对象使用的函数。正如我所说,这是由于PHP是动态语言。


将方法设为私有。

1
return $myInterface.NotPartOfInterface;

这行吗?我觉得不应该。我想你要的是::接线员。

.仅用于连接字符串。