2010-02-12 17 views
39

In PHP kann ich eine Schnittstelle angeben, um Felder zu haben, oder sind PHP-Schnittstellen auf Funktionen beschränkt?PHP: Kann ich Felder in Schnittstellen verwenden?

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

Wenn nicht, wird mir klar, ich einen Getter als Funktion in der Schnittstelle belichten kann:

entworfen
public GetField(); 
+0

Warnung: Wenn Sie eine Down-Abstimmung für die Frage erhalten, seien Sie nicht überrascht - überprüfen Sie den OOP-Abschnitt des PHP-Handbuchs. – Andreas

+3

Ja, ein kurzer Scan des Handbuchs zeigte ihnen nur Funktionen in Schnittstellen. Vielleicht habe ich diesen Teil einfach übersprungen. In jedem Fall wollte ich nur sicher sein. – Scott

Antwort

11

Schnittstellen sind nur Methoden zu unterstützen.

Dies liegt daran, dass Schnittstellen vorhanden sind, um eine öffentliche API bereitzustellen, auf die andere Objekte dann zugreifen können.

Öffentlich zugängliche Eigenschaften verletzen die Kapselung von Daten innerhalb der Klasse, die die Schnittstelle implementiert.

5

Sie können nicht angeben Eigenschaften in einem interface: nur Methoden sind erlaubt (und sinnvoll, da das Ziel einer Schnittstelle eine API angeben ist)


In PHP, versuchen Eigenschaften in einem zu definieren, diesen Teil des Codes:: Schnittstelle sollte ein Fatal Error erhöhen

interface A { 
    public $test; 
} 

Sie geben:

Fatal error: Interfaces may not include member variables in... 
14

Späte Antwort, aber die Funktionalität hier wollte bekommen, könnten Sie eine abstrakte Klasse enthält Ihre Felder zu betrachten. Die abstrakte Klasse würde wie folgt aussehen:

abstract class Foo 
{ 
    public $member; 
} 

Während Sie noch die Schnittstelle haben könnte:

interface IFoo 
{ 
    public function someFunction(); 
} 

Dann haben Sie Ihr Kind Klasse wie folgt:

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

Es gibt eine alternative Lösung für diejenigen, die immer noch neugierig und interessiert sind. :)

+3

Ich bin neugierig und interessiert. Wie garantiert man die Anwesenheit von Mitgliedern? :) – deb0rian

+0

Klasse 'Foo' sollte Interface 'IFoo' implementieren, es ist abstrakt und es würde klar 'Foo'-Zweck zeigen: um Interface-Implementierung zu vereinfachen. –

+0

Einverstanden, @PeterM. Die abstrakte Klasse könnte auch die Schnittstelle anstelle der letzten Klasse implementieren. Je nachdem, ob Sie immer gezwungen sein möchten, 'someFunction()' zu implementieren. –

11

Verwenden Sie Getter Setter. Dies kann jedoch mühsam sein, viele Getter und Setter in vielen Klassen zu implementieren und Klassenklassen zu überlisten. Und you repeat yourself!

Ab PHP 5.4 können Sie traits verwenden, um Felder und Methoden, um Klassen zu schaffen, das heißt:

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

Dies ist besonders nützlich, wenn Sie von einer Basisklasse erben und müssen einige Schnittstelle implementieren.

class CooCoo extends Bird implements IFoo 
{ 
    use WithField; 

    public function DoSomething() 
    { 
     echo $this->getField(); 
    } 
    public function DoSomethingElse() 
    { 
     echo $this->setField('blah'); 
    } 
} 
+0

Ok, aber meiner Meinung nach ist eine abstrakte Klasse besser lesbar. –

+1

Aber mit abstrakten Klasse können Sie nur von dieser Klasse erben. Mit Merkmalen und Schnittstellen haben Sie eine Art Mehrfachvererbung. Ich füge es zur Antwort hinzu. –

Verwandte Themen