PHP-使用instanceof记录IDE自动完成的变量类型
我经常使用PHP注释来解释变量的对象类型(主要是为了以后能够对类方法、成员使用IDE的自动完成功能) 评论如下:PHP-使用instanceof记录IDE自动完成的变量类型,php,Php,我经常使用PHP注释来解释变量的对象类型(主要是为了以后能够对类方法、成员使用IDE的自动完成功能) 评论如下: /* @var \Drupal\node\Entity\Node $node */ 现在IDE知道$node的类,可以给我方法等 这很方便 现在我发现,如果我检查变量的类,可以得到相同的结果,如下所示: if ($node instanceof \Drupal\node\Entity\Node) { 这样做的一个小优点是,如果您想像第一个变体那样注释掉一个更大的代码块,它不会妨碍
/* @var \Drupal\node\Entity\Node $node */
现在IDE知道$node的类,可以给我方法等
这很方便
现在我发现,如果我检查变量的类,可以得到相同的结果,如下所示:
if ($node instanceof \Drupal\node\Entity\Node) {
这样做的一个小优点是,如果您想像第一个变体那样注释掉一个更大的代码块,它不会妨碍您
使用instanceof主要是为了“声明”这样的变量类型,这是一种最佳做法还是至少不是一种坏做法?在正常情况下,这都是关于PHP中正确的类型暗示。我想说的是,为自动完成原因编写if条件不能被视为最佳实践 就像尼科·哈斯在评论中说的那样。使用PHP严格类型提示。您的IDE将识别类型提示 一个简单的例子。小心这是严格使用构造函数属性的PHP8
declare(strict_types=1);
namespace Marcel;
class LivingPlace
{
public function __construct
(
protected string $place = '',
protected string $zipcode = ''
){}
public function getPlace(): string
{
return $this->place;
}
public function getZipcode(): string
{
return $this->zipcode;
}
}
class Person
{
public function __construct
(
protected string $name = '',
protected int $age = 0,
protected ?LivingPlace $livingPlace = null
){}
public function getName(): string
{
return $this->name;
}
public function getAge(): int
{
return $this->age;
}
public function getLivingPlace(): ?LivingPlace
{
return $this->livingPlace;
}
}
正如您所看到的,每个类方法都有一个返回类型。类构造函数还具有类属性的类型提示。这是干净的代码,您的IDE知道在编写如下代码时会发生什么
$place = new LivingPlace('Wiesbaden', '65205');
$person = new Person('Marcel', 41, $place);
// output: string(9) "Wiesbaden"
var_dump($person->getLivingPlace()?->getPlace());
IDE自动知道,在调用$person
对象上的getLivingPlace()
方法时,它可以使用getPlace()
方法
结论:尽可能使用类型提示。如果在使用类型提示时条件是多余的,则写入@var注释或不必要的
instanceof
。无论$node
来自何处:为什么不使用适当的类型提示,以便生成该变量的方法也提供类型信息?