我相信这个问题已经被问了很多次,但我似乎找不到一个好的/令人满意的答案,请耐心等待。
使用PHP 7.4+,我倾向于尽可能地进行类型声明。但是我在Doctrine实体属性方面遇到了一些问题。
如果我正确地进行了类型声明,通常会出现许多类似于以下错误的错误:
访问未初始化之前,类型为App\Entity\User::$createdAt的属性是不允许的
这种类型的错误的代码示例如下:
/**
* @var DateTimeInterface
* @ORM\Column(type="datetime")
*/
protected DateTimeInterface $createdAt;
我以前的做法是将属性设置为可为空,即使数据库字段不是这样。因此代码看起来可能像下面这样。
/**
* @var DateTimeInterface|null
* @ORM\Column(type="datetime")
*/
protected ?DateTimeInterface $createdAt = null;
现在我有另一个问题。我决定在我的项目中实现一个静态代码分析器,并且现在我正在使用PHPStan。因此,当我扫描我的代码时,会出现像上面一样的错误。
行 src/Entity/Trait/TimestampableEntityPropertiesTrait.php (在App\Entity\Article类的上下文中)
16 属性App\Entity\Article::$createdAt类型映射不匹配:属性可以包含DateTimeInterface|null,但数据库期望DateTimeInterface。
那么,处理这种类型的情况的正确方式是什么?
任何建议将不胜感激。
编辑
需要注意的是,有时我不想/无法在构造函数中初始化属性,因为我还没有正确的值。