处理由于类型提示引起的PHP致命类型错误

时间:2018-08-16 12:36:02

标签: php phpstorm

TL; DR

  • 我们可以配置PHP以便当类型提示导致的参数类型错误时,它不会导致致命错误吗?
  • 是否存在PhpStorm / GIT的插件/扩展程序,以防止保存或推送包含未解决问题的代码(最好仅过滤类型提示问题进行过滤)。

对于一个我的代码库有点时髦的项目,我们正在尝试在可能的地方合并类型提示。 我们决定这样做是为了使代码库更易于阅读和维护。

我来自C#背景,因此显然编译器使我变得懒惰,因为它基本上告诉我何时尝试传递不正确类型的值。在PHP中,我们必须依靠IDE来告诉我们,但是由于没有编译,因此它实际上并不能阻止我们实现将在运行时导致致命错误的代码路径。

由于我们俩都希望继续使用这些类型提示,并且不希望它们在运行时导致致命错误,因此我们想知道是否可以通过配置PHP来抛出警告而不是致命提示的方式来配置PHP类型提示失败时。这样一来,代码就可以继续运行,并且仍然可以通知我们我们需要解决此问题。

我知道类型提示应该会导致致命的错误,但是我们正在尝试暂时解决此问题

同样对我们有用(可能很理想)的是某种插件,该插件某种程度上阻止了我们保存/推送具有此类未解决问题的代码。我们正在使用PhpStorm和GIT进行版本控制。

2 个答案:

答案 0 :(得分:1)

我的建议是开始对添加的任何新代码或更改的旧代码实施自动化测试。因此,您将立即查看是否损坏了任何内容,或者是否存在触发类型错误的执行路径。

Here is an article on how to implement test automation in legacy systems

答案 1 :(得分:1)

不确定这是否可行,我怀疑这是可能的。

但是:请不要。

相反,您可以:

  • 编写单元测试,例如using PhpUnit
  • 允许“空”响应和参数,同时如果传递值则要求输入类型
  • 要求代码使用代码质量检查器通过某些条件,例如Codacy(还有很多其他条件!)

对于null响应或null参数,请考虑以下事项:

/**
 * @var User
 * @ORM\ManyToOne(targetEntity="User\Entity\User", fetch="EAGER")
 * @ORM\JoinColumn(name="bcc_user_id", referencedColumnName="id", nullable=false)
 */
protected $bcc;

这是我的一个项目中类的属性的示例。对于这种情况下的邮件实体。它应该具有实例User的类对象。正常的(生成的)吸气剂/设置剂最终将是:

/**
 * @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。或者可以删除一个值使其为空。因此,我们必须在设置器中允许null作为参数。吸气剂必须能够返回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 & answersPHP 7.2 "new features"发行说明。