在PHP 5中,是否可以有一个具有私有/受保护方法的接口?
现在我的代码是:
interface iService
{
private method1();
}
出现了错误:
解析错误:语法错误,意外的T_STRING,预期T_VARIABLE
我只是想确认一个接口只能包含公共方法。
接口用于描述实现该接口的类的公共方法。您不能在接口中有私有方法。接口中的任何方法都被认为是正在使用的,不应更改。
这里是PHP中的接口文档链接,但这在面向对象编程中是标准做法。
通常情况下,接口只能有公共成员,因为接口的唯一功能是被继承。
来自PHPfreaks.com教程:
PHP5具有接口特性。不要与更一般意义上的接口混淆,接口关键字创建的实体可用于在不必像抽象类那样扩展它们的情况下对类强制执行共同的接口。而是实现接口。
接口与抽象类不同。首先,它们实际上不是类。它们不定义属性,也不定义任何行为。在接口中声明的方法必须在实现它的类中声明。
由于在更一般意义上,一个接口是对象与其他代码交互的定义,所以所有方法必须声明为公共的(请参见本章节中关于可见性的部分)。使用抽象类时,抽象方法可以有任何可见性,但扩展类必须使用相同(或更弱)的可见性来实现其实现。实现接口将把这些方法作为抽象方法添加到主题类中,未实现它将导致类似以下内容的错误:
致命错误:SomeConcreteClass类包含n个抽象方法,并且因此必须声明为抽象或实现剩余的方法。是的,抽象类可以实现接口。
接口是类型声明。一个类型是一组值,加上一组可以从外部执行的操作。私有方法不符合这个概念。
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
可以声明为私有。那么它对其他对象有什么用处呢?它不能从外部调用,也不是其接口的一部分。
在许多情况下,接口定义可以帮助其他模块保证类的行为和API。在这些情况下,私有方法并不是其他模块可以访问或理解的内容。这就是为什么您永远不能将私有方法放在接口上的原因。
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);
}
class ExampleService extends AbstractService
{
protected function process($result)
{
$result->setSuccess('All done');
}
}
通过这种方式,接口可以满足公共契约,并且通过AbstractService
类,实现内部契约。应用程序只需要在适用的地方强制使用AbstractService
类即可。
大错特错,接口中的任何方法都不可能有私有或受保护的访问标识符。
**在接口中声明的所有方法都必须是公共的;这是接口的本质。
关于接口的其他有趣事实
接口可以使用 extends 运算符像类一样进行扩展。它们只能扩展其他接口。(来源:https://www.php.net/manual/en/language.oop5.interfaces.php)
请注意,在接口中声明构造函数是可能的,在某些情况下非常有用,例如供工厂使用。签名应该与子类中的相同。
在您的情况下,甚至还存在另一个问题-函数声明中缺少 function 关键字。 它应该是
interface iService
{
public function method1();
}
private function method1();
而不是private method1();
。 - tvanc