TL;DR
对于我正在做的一个有点时髦的代码库的项目,我们正试图在我们能做到的地方加入类型提示。我们决定这样做是为了让代码库更容易阅读和维护。
我有C#背景,所以很明显编译器让我变懒了,因为当我试图传递一个错误类型的值时,它基本上会告诉我。在PHP中,我们必须依靠IDE告诉我们,但由于没有编译,这并不能阻止我们实现在运行时会导致致命错误的代码路径。
由于我们都希望继续使用这些类型提示,并且不想让它在运行时导致致命错误,我们想知道是否可以将PHP配置为在类型提示失败时抛出警告而不是致命错误。这将允许代码保持运行,并仍然通知我们需要解决此问题的事实。
我知道类型提示在设计上应该会导致死亡,但是我们正在尝试暂时解决这个问题。
对我们也有效的(可能是理想的)是某种插件,它以某种方式阻止我们保存/推送有类似这样未解决问题的代码。我们使用PhpStorm和GIT进行版本控制。
发布于 2018-08-16 20:47:52
我的建议是开始对添加的任何新代码或更改的旧代码执行自动化测试。因此,您将立即看到您是否破坏了任何东西,或者是否存在触发类型错误的执行路径。
Here is an article on how to implement test automation in legacy systems
发布于 2018-08-19 05:02:30
不确定这是否可能,我怀疑它是可能的。
但是:请不要这样做。
相反,您可以:
对于null响应或null参数,请考虑以下内容:
/**
* @var User
* @ORM\ManyToOne(targetEntity="User\Entity\User", fetch="EAGER")
* @ORM\JoinColumn(name="bcc_user_id", referencedColumnName="id", nullable=false)
*/
protected $bcc;
这是我的一个项目中一个类的属性的示例。在本例中为Mail实体。它应该有一个实例User的类对象。一个正常的(生成的) getter/setter最终会是:
/**
* @return User
*/
public function getBcc() : User
{
return $this->bcc;
}
/**
* @param User $bcc
*
* @return Mail
*/
public function setBcc(User $bcc) : Mail
{
$this->bcc = $bcc;
return $this;
}
然而,它是电子邮件的“密件抄送”。所以,它可以是空的。或者可以删除一个值,使其为null。因此,我们必须允许在setter中使用null
作为参数。getter必须能够返回null
。
/**
* @return null|User
*/
public function getBcc() : ? User
{
return $this->bcc;
}
/**
* @param null|User $bcc
*
* @return Mail
*/
public function setBcc( ? User $to) : Mail
{
$this->bcc = $bcc;
return $this;
}
好了。2个问号就够了。
另外,还可以查看this question & answers和PHP 7.2 "new features"发行说明。
https://stackoverflow.com/questions/51877261
复制相似问题