PHP: Могу ли я использовать поля в интерфейсах? - PullRequest
42 голосов
/ 12 февраля 2010

Могу ли я указать в PHP интерфейс для полей или интерфейсы PHP ограничены функциями?

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

Если нет, я понимаю, что могу представить геттер как функцию в интерфейсе:

public GetField();

Ответы [ 5 ]

47 голосов
/ 12 февраля 2010

Вы не можете указывать участников. Вы должны указать их присутствие через геттеры и сеттеры, как и вы. Однако вы можете указать константы:

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

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

19 голосов
/ 11 мая 2013

Поздний ответ, но чтобы получить требуемую функциональность здесь, вы можете рассмотреть абстрактный класс, содержащий ваши поля. Абстрактный класс будет выглядеть так:

abstract class Foo
{
    public $member;
}

Хотя у вас еще может быть интерфейс:

interface IFoo
{
    public function someFunction();
}

Тогда у вас есть дочерний класс, подобный этому:

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;
    }
}

Есть альтернативное решение для тех, кто все еще интересуется и интересуется. :)

14 голосов
/ 12 февраля 2010

Интерфейсы предназначены только для поддержки методов.

Это связано с тем, что существуют интерфейсы для предоставления общедоступного API, к которому затем могут обращаться другие объекты.

Общедоступные свойства фактически нарушают инкапсуляцию данных в классе, который реализует интерфейс.

13 голосов
/ 18 апреля 2014

Использовать установщик геттера. Но это может быть утомительным для реализации многих методов получения и установки во многих классах, и это загромождает код класса. И ты повторяешься !

Начиная с 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');
    }
}

Это особенно полезно, если вам нужно наследовать от некоторого базового класса и нужно реализовать какой-то интерфейс.

class CooCoo extends Bird implements IFoo
{
    use WithField;

    public function DoSomething()
    {
        echo $this->getField();
    }
    public function DoSomethingElse()
    {
        echo $this->setField('blah');
    }
}
5 голосов
/ 12 февраля 2010

Нельзя указывать свойства в interface: разрешены только методы (и имеет смысл, поскольку целью интерфейса является указание API)


В PHP попытка определить свойства в интерфейсе должна вызвать фатальную ошибку: эта часть кода:

interface A {
  public $test;
}

Даст вам:

Fatal error: Interfaces may not include member variables in...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...