有关此示例的问题:
<?php declare(strict_types=1);
class SomeTestClass
{
/** @var string|null */
private $name;
/** @var string */
private $sth;
public function getName(): ?string
{
return $this->name;
}
public function setSomething(string $value): void
{
$this->sth = $value;
}
public function something(): void
{
$this->setSomething($this->getName());
}
}
为什么 PhpStorm 2018.3.5 没有通知我something()
中与使用可空值作为不应为空的方法参数有关的错误代码?我问这个问题是因为当$name
属性为null
时,我的应用程序中会出现错误。
版本
public function something(): void
{
/** @var string|null $name */
$name = $this->getName();
$this->setSomething($name);
}
也不起作用。
答案 0 :(得分:1)
PhpStorm在分析代码时不是很严格。例如,通过构造函数注入属性值时,它不会在自动完成方法和属性时查看声明的属性类型,而是查看注入到构造函数中的类型。
要进行非常严格的分析,请尝试PHPStan。与PhpStorm不同,您可以轻松地将其添加到CI构建中。 See the resulting error for your example。
答案 1 :(得分:0)
我认为PhpStorm检查被实例变量类型注释破坏了。
如果我直接使用:
$this->setSomething(null);
我收到类型错误。
但是,如果我直接将null分配给$this->sth
,则完全不会出错:
$this->sth = null;
基本上,不要依靠strict_types=1
来正确检查变量类型注释