2016-05-16 54 views
26

php 7, sınıf özellikleri için yazı tipi ipuçlarını destekler mi?PHP 7'deki özellikler için yazı tipi ipucu?

Sadece setters/getters için değil, mülkün kendisi için. gibi

şey:

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

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

Bildiğim kadarıyla değil. Bununla birlikte, genel olarak, bir mülkün değeri üzerindeki * herhangi bir * kısıtlama, bir düzenleyici aracılığıyla yapılmalıdır. Belirleyici kolayca "değer" argümanı için bir tiphint'e sahip olabileceğinden, gitmekte fayda var. –

+0

Buradaki birçok çerçeve, _protected_ özniteliklerini kullanır (çoğunlukla denetleyiciler için). Özellikle bu durumlarda çok yararlı olacaktır. – CarlosCarucce

cevap

37

PHP 7.0, (2016 -05-16), bunu desteklemiyor. Bu yönde bazı çabalar olmuştur (PHP 7.1 için reddedilen Typed Properties RFC gibi), ancak şu anda doğrudan destek yoktur.


Bu arada, bazı alternatifler vardır.

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

Ayrıca kamu malına yapmak ve kodu okuyan insanlara tip bilgileri sağlamak için bir sınıfın üstünde kullanabilirsiniz:

Yalnızca türü bildirimleri görülüyor Alıcı ve ayarlayıcıların aracılığıyla erişilebilen bir özel mülkiyeti yapabilirsiniz alıcılar ve ayarlayıcılar ve her sınıfın üstünde

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

gerçekten de sen birleştirebilirsiniz: ve bir IDE kullanarak, ama bu zamanı tür denetimine sağlar.

Daha maceraperestseniz, __get, __set, __isset and __unset magic methods ile sahte bir mülk edinebilir ve türlerini kendiniz kontrol edebilirsiniz. Yine de tavsiye edeceğimden emin değilim.

+0

Gerçekten çok iyi geliyor. Bir sonraki sürümde neler olduğunu görmek için sabırsızlanıyorum! – CarlosCarucce

+10

Ugh. Bu RFC başarısız oldu utanma :( –

+2

Bu RFC neden reddedildi bazı açıklama var mı? –

0

kullanabilirsiniz ayarlayıcı

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

Çıktı: yazılma zamanında şimdiki küçük sürümüdür

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