在PHP 7中键入属性的提示?
问题描述:
php 7是否支持类属性的类型提示?在PHP 7中键入属性的提示?
我的意思是,不仅setter/getters,但财产本身。
喜欢的东西:
class Foo {
/**
*
* @var Bar
*/
public $bar : Bar;
}
$fooInstance = new Foo();
$fooInstance->bar = new NotBar(); //Error
答
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来制造假冒产品,并自行检查类型。不过,我不确定我是否会推荐它。
答
您可以使用二传手
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 ...
不是我所知道的。然而,一般来说,对物业价值的任何限制都应该通过设置者完成。既然二传手可以很容易地为“价值”论点提供一个类型提示,那么你就很好。 –
许多框架使用_protected_属性(主要用于控制器)。特别是对于这些情况,这将非常有用。 – CarlosCarucce