在PHP 7中键入属性的提示?

在PHP 7中键入属性的提示?

问题描述:

php 7是否支持类属性的类型提示?在PHP 7中键入属性的提示?

我的意思是,不仅setter/getters,但财产本身。

喜欢的东西:

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

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

不是我所知道的。然而,一般来说,对物业价值的任何限制都应该通过设置者完成。既然二传手可以很容易地为“价值”论点提供一个类型提示,那么你就很好。 –

+0

许多框架使用_protected_属性(主要用于控制器)。特别是对于这些情况,这将非常有用。 – CarlosCarucce

PHP 7.0,这是在写本新闻时的当前次要版本(2016 -05-16),不支持这一点。在这方面已经做了一些努力(如Typed Properties RFC,PHP 7.1被拒绝),但目前没有直接的支持。


在此期间,有一些替代方案。

您可以拨打私人财产只有通过getter和setter方法具有类型声明访问:

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

您也可以使公共财产和使用的docblock提供类型信息的人阅读的代码并使用IDE,但是这不提供运行时类型检查:

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

事实上,你可以结合getter和setter和文档块。

如果您更喜欢冒险,可以使用__get, __set, __isset and __unset magic methods来制造假冒产品,并自行检查类型。不过,我不确定我是否会推荐它。

+0

听起来很不错。迫不及待想看看下一个版本会有什么变化! – CarlosCarucce

+10

呃。惭愧RFC失败:( –

+2

有没有解释为什么这个RFC被拒绝? –

您可以使用二传手

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

输出:

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