PHP:我可以在接口中使用字段吗?

在PHP中,我可以指定一个接口有字段,或PHP接口限于function?

<?php interface IFoo { public $field; public function DoSomething(); public function DoSomethingElse(); } ?> 

如果没有,我意识到我可以在接口中公开一个getter函数:

 public GetField(); 

你不能指定成员。 你必须通过getter和setter来表示他们的存在,就像你一样。 但是,您可以指定常量:

 interface IFoo { const foo = 'bar'; public function DoSomething(); } 

http://www.php.net/manual/en/language.oop5.interfaces.php

迟到的答案,但要获得这里的function,你可能要考虑一个包含你的领域的抽象类。 抽象类看起来像这样:

 abstract class Foo { public $member; } 

虽然你仍然可以拥有界面:

 interface IFoo { public function someFunction(); } 

那么你有这样的孩子class:

 class bar extends Foo implements IFoo { public function __construct($memberValue = "") { // Set the value of the member from the abstract class $this->member = $memberValue; } public function someFunction() { // Echo the member from the abstract class echo $this->member; } } 

对于那些仍然感兴趣和好奇的人来说,还有一个替代scheme。 🙂

接口仅用于支持方法。

这是因为接口存在提供一个公共API,然后可以被其他对象访问。

公开访问的属性实际上会违反实现接口的类中的数据封装。

使用getter setter。 但是在许多类中实现许多getter和setter可能会很繁琐,而且会使类代码混乱。 而你重复自己 !

从PHP 5.4开始,您可以使用特征为类提供字段和方法,即:

 interface IFoo { public function DoSomething(); public function DoSomethingElse(); public function setField($value); public function getField(); } trait WithField { private $_field; public function setField($value) { $this->_field = $value; } public function getField() { return $this->field; } } class Bar implements IFoo { use WithField; public function DoSomething() { echo $this->getField(); } public function DoSomethingElse() { echo $this->setField('blah'); } } 

这是特别有用的,如果你必须从一些基类inheritance,需要实现一些接口。

 class CooCoo extends Bird implements IFoo { use WithField; public function DoSomething() { echo $this->getField(); } public function DoSomethingElse() { echo $this->setField('blah'); } } 

您不能在interface指定属性:只允许使用方法(并且有意义,因为接口的目标是指定一个API)

在PHP中,试图在界面中定义属性应该会引发致命错误:这部分代码:

 interface A { public $test; } 

会给你 :

 Fatal error: Interfaces may not include member variables in...