In PHP, can I specify an interface to have fields, or are PHP interfaces limited to functions?
If not, I realize I can expose a getter as a function in the interface:
public GetField[];
asked Feb 12, 2010 at 11:52
2
You cannot specify members. You have to indicate their presence through getters and setters, just like you did. However, you can specify constants:
interface IFoo
{
const foo = 'bar';
public function DoSomething[];
}
See //www.php.net/manual/en/language.oop5.interfaces.php
answered Feb 12, 2010 at 12:03
GordonGordon
308k72 gold badges527 silver badges552 bronze badges
Late answer, but to get the functionality wanted here, you might want to consider an abstract class containing your fields. The abstract class would look like this:
abstract class Foo
{
public $member;
}
While you could still have the interface:
interface IFoo
{
public function someFunction[];
}
Then you have your child class like this:
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;
}
}
There's an alternative solution for those still curious and interested. :]
answered May 11, 2013 at 3:48
WIMP_noWIMP_no
5095 silver badges7 bronze badges
4
Use getter setter. But this might be tedious to implement many getters and setters in many classes, and it clutter class code. And you repeat yourself!
As of PHP 5.4 you can use traits to provide fields and methods to classes, ie:
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'];
}
}
This is specially usefull if you have to inherit from some base class and need to implement some interface.
class CooCoo extends Bird implements IFoo
{
use WithField;
public function DoSomething[]
{
echo $this->getField[];
}
public function DoSomethingElse[]
{
echo $this->setField['blah'];
}
}
answered Apr 18, 2014 at 14:01
1
Interfaces are only designed to support methods.
This is because interfaces exist to provide a public API that can then be accessed by other objects.
Publicly accessible properties would actually violate encapsulation of data within the class that implements the interface.
answered Feb 12, 2010 at 11:54
Noah GoodrichNoah Goodrich
24.5k13 gold badges65 silver badges95 bronze badges
You cannot specify properties in an interface
: only methods are allowed [and make sense, as the goal of an interface is to specify an API]
In PHP, trying to define properties in an interface should raise a Fatal Error : this portion of code :
interface A {
public $test;
}
Will give you :
Fatal error: Interfaces may not include member variables in...
answered Feb 12, 2010 at 11:56
Pascal MARTINPascal MARTIN
389k77 gold badges647 silver badges656 bronze badges