PHP-使用instanceof记录IDE自动完成的变量类型

PHP-使用instanceof记录IDE自动完成的变量类型,php,Php,我经常使用PHP注释来解释变量的对象类型(主要是为了以后能够对类方法、成员使用IDE的自动完成功能) 评论如下: /* @var \Drupal\node\Entity\Node $node */ 现在IDE知道$node的类,可以给我方法等 这很方便 现在我发现,如果我检查变量的类,可以得到相同的结果,如下所示: if ($node instanceof \Drupal\node\Entity\Node) { 这样做的一个小优点是,如果您想像第一个变体那样注释掉一个更大的代码块,它不会妨碍

我经常使用PHP注释来解释变量的对象类型(主要是为了以后能够对类方法、成员使用IDE的自动完成功能)

评论如下:

/* @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
来自何处:为什么不使用适当的类型提示,以便生成该变量的方法也提供类型信息?