2016-05-16 3 views
26

Unterstützt PHP 7 Typenhinweis für Klasseneigenschaften?Typ Hinting für Eigenschaften in PHP 7?

Ich meine, nicht nur für Setter/Getter aber für die Eigenschaft selbst.

Etwas wie:

class Foo { 
    /** 
    * 
    * @var Bar 
    */ 
    public $bar : Bar; 
} 

$fooInstance = new Foo(); 
$fooInstance->bar = new NotBar(); //Error 
+1

Nicht, dass ich mir dessen bewusst bin. Im Allgemeinen sollten jedoch * alle * Einschränkungen für den Wert einer Eigenschaft durch einen Setter vorgenommen werden. Da der Setter leicht einen Typhint für das Argument "Wert" haben kann, ist es gut zu gehen. –

+0

Viele Frameworks verwenden _protected_attribute (hauptsächlich für Controller). Gerade in diesen Fällen wäre das sehr nützlich. – CarlosCarucce

Antwort

37

PHP 7.0, die zum Zeitpunkt des Schreibens (2016 die aktuelle Minor-Release ist -05-16), unterstützt dies nicht. Es gab einige Anstrengungen in dieser Richtung (wie die Typed Properties RFC, die für PHP 7.1 abgelehnt wurde), aber es gibt derzeit keine direkte Unterstützung.


In der Zwischenzeit gibt es einige Alternativen.

Sie können ein Privatgrundstück, das nur durch Getter und Setter zugänglich ist, die Typdeklarationen haben:

class Person 
{ 
    private $name; 
    public function getName(): string { 
     return $this->name; 
    } 
    public function setName(string $newName) { 
     $this->name = $newName; 
    } 
} 

Sie können auch ein öffentliches Eigentum machen und einen Docblock verwenden Typinformationen zu den Menschen, um die Code-Lese und unter Verwendung einer IDE, aber dies stellt keine Laufzeittyp-Kontrolle:

class Person 
{ 
    /** 
     * @var string 
     */ 
    public $name; 
} 

und in der Tat, können Sie Getter und Setter und einen Docblock kombinieren.

Wenn Sie abenteuerlustiger sind, könnten Sie eine gefälschte Eigenschaft mit der __get, __set, __isset and __unset magic methods machen, und überprüfen Sie die Typen selbst. Ich bin mir nicht sicher, ob ich es empfehlen würde.

+0

Klingt wirklich gut. Ich kann es kaum erwarten zu sehen, was bei den nächsten Veröffentlichungen kommt! – CarlosCarucce

+10

Ugh. Schade, dass RFC fehlgeschlagen :( –

+2

Gibt es eine Erklärung, warum dieser RFC abgelehnt wurde? –

0

Sie Setter

class Bar { 
    public $val; 
} 

class Foo { 
    /** 
    * 
    * @var Bar 
    */ 
    private $bar; 

    /** 
    * @return Bar 
    */ 
    public function getBar() 
    { 
     return $this->bar; 
    } 

    /** 
    * @param Bar $bar 
    */ 
    public function setBar(Bar $bar) 
    { 
     $this->bar = $bar; 
    } 

} 

$fooInstance = new Foo(); 
// $fooInstance->bar = new NotBar(); //Error 
$fooInstance->setBar($fooInstance); 

Ausgabe verwenden:

TypeError: Argument 1 passed to Foo::setBar() must be an instance of Bar, instance of Foo given, called in ...