是否可以使用具有私有/受保护方法的接口?

时间:2009-12-09 20:09:49

标签: php oop interface

PHP 5中是否可以使用具有私有/受保护方法的接口?

现在我有:

interface iService
{
    private method1();
}

抛出错误:

  

解析错误:语法错误,意外T_STRING,期待T_VARIABLE

我只想确认接口只能包含公共方法。

7 个答案:

答案 0 :(得分:114)

PHP manual page about interfaces明确指出:

  

接口中声明的所有方法都必须是公共的;这是界面的本质。

我想这可以解释你得到的错误; - )

答案 1 :(得分:20)

接口用于描述实现该接口的类的公共方法。您永远不能在界面中拥有私有方法。假设接口中的任何方法都在使用中,不应更改。

Interfaces是PHP链接,但这是OO编程的标准。

答案 2 :(得分:9)

通常,接口只能有公共成员,因为接口的唯一功能是继承。

来自PHPfreaks.com教程:

  

PHP5具有接口功能。不是   与更多的接口混淆   一般意义上,接口关键字   创建一个可以用来的实体   强制执行一个共同的接口   类而不必扩展它们   喜欢抽象类。相反   接口已实现。

     

接口与摘要不同   类。首先,他们实际上并非如此   类。他们没有定义属性,   他们没有定义任何行为。   在接口中声明的方法   必须在那些类中声明   实现它。

     

因为界面中的更多   一般意义是如何定义   一个对象与其他代码交互,   所有方法都必须公开   (见本节可见性部分   章节)。使用抽象类,一个   抽象方法可以有任何   可见性,但扩展类   必须有他们的实现使用   相同(或较弱)的可见性。   实现一个接口添加了   方法作为抽象方法   主题类,未能实现它   会导致像这样的错误   以下内容:

     

致命错误:类SomeConcreteClass   包含n个抽象方法和必须   因此被宣布为抽象或   实现其余的方法,   抽象类可以实现   接口

答案 3 :(得分:6)

接口是类型声明。一个类型是一组值,加上一组可以从外部进行的操作。私有方法不适合这张图片。

interface T {
  public /*int*/ function f(array $a);
}
interface U {
  public /*T*/ function g(T $t);
}

class C implements U {
    public function g(T $t) {
        ...
        $x = $t->f();
        ...
    }
}

接口很有用,因为它们表示对象的接口。对象如何与他们的环境进行通信。

现在让我们说T::f可以被宣布为私有。这对其他对象有什么用?它不能从外部调用,它不会成为其界面的一部分。

答案 4 :(得分:3)

在许多情况下,接口定义可帮助其他模块保证类的行为和API。在这些情况下,私有方法不是其他模块可以访问或理解的东西。这就是为什么你永远不能在接口上放置私有方法的原因。

答案 5 :(得分:0)

,该接口中的任何方法都永远不会具有私有或受保护的访问标识符。

**在接口中声明的所有方法必须是公共的;这就是界面的本质。

关于界面的其他有趣事实

可以使用extends运算符像类一样扩展接口。它们只能扩展其他接口。 (来源:https://www.php.net/manual/en/language.oop5.interfaces.php

请注意,可以在接口中声明构造函数,这在某些情况下非常有用,例如供工厂使用。子类中的签名应该相同。

对于您而言,甚至还有另一个问题-函数声明中缺少函数关键字。 应该是

interface iService
{
    public function method1();
}

答案 6 :(得分:0)

如上所述,接口只能定义公开可见的方法。我想展示一个如何处理受保护方法的示例。要强制使用特定的受保护方法,可以创建一个实现该接口的抽象类。

如果抽象类已经可以处理一些工作量,以简化实际实现,则这尤其有意义。例如,在这里,抽象类负责实例化结果对象,这总是需要的:

首先,界面。

interface iService
{
   /**
    * The method expects an instance of ServiceResult to be returned.
    * @return ServiceResult
    */
    public function doSomething();
}

然后,抽象类定义内部方法结构:

abstract class AbstractService implements iService
{
    public function doSomething()
    {
        // prepare the result instance, so extending classes
        // do not have to do it manually themselves.
        $result = new ServiceResult();

        $this->process($result);

        return $result;
    }

   /**
    * Force all classes that extend this to implement
    * this method.
    *
    * @param ServiceResult $result
    */
    abstract protected function process($result);
}

执行实际实现的类自动从abstact类继承接口,只需要实现受保护的方法即可。

class ExampleService extends AbstractService
{
    protected function process($result)
    {
         $result->setSuccess('All done');
    }
}

通过这种方式,接口可以履行公共合同,并且通过AbstractService类,可以满足内部合同。应用程序仅在适用的情况下只需强制使用AbstractService类即可。