【问题标题】:Why do all functions in an interface have to be public?为什么接口中的所有功能都必须是公共的?
【发布时间】:2015-01-04 07:18:49
【问题描述】:

如标题所述:为什么添加到接口的每个功能都必须是公开的?

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

http://php.net/interface

上面引用中所述的接口的性质是什么?

让一个类实现一个接口,而另一个类扩展该类怎么样。为什么不能在扩展主类的类中定义必要的方法?

请注意:我确实知道如何使用接口,但我只是想知道为什么这些东西无法预定义。

【问题讨论】:

  • 接口的本质是接口中声明的所有方法都必须是公共的
  • 函数必须是公开的,否则会出错!但一件好事 :D 你不必写 public 因为它们是默认的 public!
  • 实现该接口的类如果是私有的或受保护的,将无法使用签名。
  • 我能问一下为什么这个问题被否决了吗?因为这是一个对于刚接触接口的程序员来说非常好的问题......
  • @DanielGelling:一个可能的原因是存在重复问题(请参阅:stackoverflow.com/questions/17576/… 或搜索 public+interface)

标签: php oop interface


【解决方案1】:

接口概念背后的思想是将一个类的外部接口与它的内部实现分开。它用于确保使用实现接口的类的其他类,他们期望它具有的功能实际上存在。如果您想强制采用特定的实现方式,您可以使用抽象类 (http://php.net/manual/en/language.oop5.abstract.php)。

【讨论】:

    【解决方案2】:

    接口的本质是暴露一组行为,这就是它隐式公开的原因。所以如果它是私有的,你就不会暴露行为。

    【讨论】:

      【解决方案3】:

      在更一般的(非 PHP 特定的)级别上,接口提供了类承诺提供给其他对象使用的方法列表。

      接口中的私有方法不会得到任何东西,因为只有实现类才能使用它。因此,任何标记为私有的东西都可能不会在界面中列出。

      【讨论】:

      • 让一个类实现一个接口,另一个类扩展该类怎么样。为什么不能在扩展主类的类中定义必要的方法?
      • @DanielGelling 因为:如何从未定义函数的接口扩展(行为)!你想继承什么?!?
      • 我的理解是,由于继承自实现类,所以保证了所有接口方法的实现。如果你愿意,它们可以覆盖它们,但它们不是必须的。
      • 如果您想强制采用特定的实现方式,您可以使用抽象类 (php.net/manual/en/language.oop5.abstract.php)。
      【解决方案4】:

      接口允许您定义方法而不实际实现它们,例如:

      public function setVariable($name, $var);
      

      请注意函数末尾的;,而您通常会将{ 与其余代码放在一起。

      当一个类实现一个接口时,期望implement定义的所有方法,例如:

      public function setVariable($name, $var) {
          //do more stuff here
      }
      

      所以创建一个private 将毫无意义,因为实现类将无法访问它。

      【讨论】:

      • 不知道投了多少票。我认为这是一个很好的答案!你展示了为什么不能在接口中创建私有函数! +1
      • @Rizier123 谢谢!是的,对否决票进行解释会很好。但是我们去...
      • 我还没有投反对票,但对我来说,您的回答并未涵盖在接口中使用公共功能/方法的真正原因。您的回答之后的一个返回问题是:“为什么我们不能在接口中包含受保护的函数/方法”?
      【解决方案5】:

      Interface 中的Functions 必须是公开的,否则会出错!

      一个例子是这样的:

      interface A
      {
          private method1();
      }
      

      你会得到这样的错误:

      Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE
      

      所以你必须在接口中编写公共函数!

      【讨论】:

      • 我认为这是因为问题要求更多解释为什么 php 不允许它。这并没有真正解释为什么不能做,而是说“你不能做,因为你做不到”。
      • 您没有回答这个问题,即接口中描述的方法是公共的这一事实背后的原因是什么。您提供的答案是这一事实的结果。
      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2013-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多