PHP: Могу ли я использовать поля в интерфейсах?
В PHP я могу указать интерфейс для наличия полей или интерфейсы PHP ограничены функциями?
<?php
interface IFoo
{
public $field;
public function DoSomething();
public function DoSomethingElse();
}
?>
Если нет, я понимаю, что я могу выставить getter как функцию в интерфейсе:
public GetField();
Ответы
Ответ 1
Вы не можете указать участников. Вы должны указать свое присутствие через геттеры и сеттеры, как и вы. Однако вы можете указать константы:
interface IFoo
{
const foo = 'bar';
public function DoSomething();
}
См. http://www.php.net/manual/en/language.oop5.interfaces.php
Ответ 2
Поздний ответ, но чтобы получить нужные функции, вы можете рассмотреть абстрактный класс, содержащий ваши поля. Абстрактный класс будет выглядеть следующим образом:
abstract class Foo
{
public $member;
}
Пока вы все еще можете иметь интерфейс:
interface IFoo
{
public function someFunction();
}
Тогда у вас есть свой класс child следующим образом:
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;
}
}
Есть альтернативное решение для тех, кто все еще любопытен и заинтересован.:)
Ответ 3
Интерфейсы предназначены только для поддержки методов.
Это связано с тем, что существуют интерфейсы для предоставления публичного API, к которому затем могут обращаться другие объекты.
Публично доступные свойства фактически будут нарушать инкапсуляцию данных в классе, реализующем интерфейс.
Ответ 4
Использовать сеттер. Но это может быть утомительно для реализации многих геттеров и сеттеров во многих классах, и это загромождает класс кода. И вы повторяете.
Начиная с PHP 5.4 вы можете использовать traits для предоставления полей и методов классам, например:
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');
}
}
Это особенно полезно, если вам нужно наследовать от некоторого базового класса и нужно реализовать некоторый интерфейс.
class CooCoo extends Bird implements IFoo
{
use WithField;
public function DoSomething()
{
echo $this->getField();
}
public function DoSomethingElse()
{
echo $this->setField('blah');
}
}
Ответ 5
Вы не можете указать свойства в interface
: допускаются только методы (и смысл, поскольку целью интерфейса является указание API)
В PHP, пытаясь определить свойства в интерфейсе, необходимо вызвать Fatal Error: эта часть кода:
interface A {
public $test;
}
Вы получите:
Fatal error: Interfaces may not include member variables in...