PHP 5中是否可以使用具有私有/受保护方法的接口?
现在我有:
interface iService
{
private method1();
}
抛出错误:
解析错误:语法错误,意外T_STRING,期待T_VARIABLE
我只想确认接口只能包含公共方法。
答案 0 :(得分:114)
答案 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
类即可。