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(); }
迟到的答案,但要获得这里的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...