Подтвердить что ты не робот

PHP: Могу ли я использовать поля в интерфейсах?

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

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

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

public GetField();
4b9b3361

Ответ 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...