代码之家  ›  专栏  ›  技术社区  ›  Glubus

处理由于引入类型暗示而导致的PHP致命类型错误

  •  2
  • Glubus  · 技术社区  · 7 年前

    TL;博士

    • 我们是否可以配置PHP,使其在类型提示导致参数类型错误时不会导致致命错误,并导致警告?

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

    由于我们都希望继续使用这些类型提示,而不是让它在运行时导致致命错误,因此我们想知道是否可以将PHP配置为在类型提示失败时抛出警告而不是致命警告。这将允许代码继续运行,并且仍然通知我们需要修复此问题的事实。

    我理解类型提示在设计上应该会导致致命错误,但是我们正在暂时解决这个问题

    对我们同样有效(并且可能是理想的)的是某种插件,它以某种方式阻止我们保存/推送具有此类未解决问题的代码。我们正在使用PhpStorm和GIT进行版本控制。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Eriks Klotins    7 年前

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

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

        2
  •  1
  •   rkeet Aurimas    7 年前

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

    相反,你可以:

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

    这是我的一个项目中一个类的属性的示例。对于本例中的邮件实体。它应该有一个实例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中的param。getter必须能够返回 无效的 .

    /**
     * @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" 发行说明。

    推荐文章