【问题标题】:Where should I check variable type with PHP 7?我应该在哪里使用 PHP 7 检查变量类型?
【发布时间】:2018-06-13 09:37:24
【问题描述】:

随着版本 7 的到来,PHP 引入了标量类型、可为空的标量类型和返回类型。使用这些是立即有益的(自我记录代码,运行时的致命错误,列表继续)但我不确定我应该在我的代码中的哪个点开始使用它们。我觉得答案应该是“尽快”。

在 PHP 7 之前,我的很多代码看起来像示例类。我的控制器将初始化一个类并将 POST 变量传递给它。然后我会在类中进行变量类型检查,以确保所有变量都是正确的。

class User {
     public function createUser($username, $password, $some_float)
     {
          // Check types, validate vars and create user
     }
}

使用 PHP 7,我可以做到这一点

class User {
     public function createUser(string $username, string $password, float $some_float)
     {
          // Validate vars and create user
     }
}

如果我使用第二个示例,这意味着将大量类型检查代码从 User 类中移出,并移到调用它的 Controller 中。我真的不喜欢用类型检查来膨胀我的控制器的想法。

【问题讨论】:

  • 为什么必须将类型检查代码移至控制器? typehint 的规范你的类型检查代码。
  • 您当前的createUser 方法在无效类型的情况下会做什么?如果您已经在使用异常模型,那么您只需调整控制器以捕获Throwable,因为内部TypeError 类实现了它。如果您依赖返回值,那么是的,您需要额外的重构。请记住,PHP 会将类型转换为您的标量类型提示(除非使用 strict_types),因此变量类型不需要精确。
  • @AlexHowansky 因为它会导致自我记录代码并使其他开发人员清楚,所以严格类型有很多好处。
  • 添加代码来显式检查类型肯定不是我所说的自我记录或严格类型。它增加了不必要的复杂性并增加了错误的机会。本机类型提示自记录的、严格的、简单的和清晰的。它们将被 API 文档生成器和 IDE 拾取以进行自动补全——您无法通过手动类型检查获得这两者。
  • 如果您已经在控制器中捕获异常,那么我建议添加类型提示,将 catch 块更改为 catch (Throwable... 并看看会发生什么。听起来这会给你两全其美,而无需一次重新设计太多。也就是说,我们现在肯定会转向基于意见的。

标签: php types nullable


【解决方案1】:

我相信对这个问题的任何答案都会在一定程度上得到认可,如果它真的适合 stackoverlow,我们就处于灰色区域。不过,我会尽量客观地回答。

根据我的经验,与运行时性能或可维护性等任何其他考虑因素相比,稳健性具有更高的优先级,这将受益于更好的开发人员文档。

在此基础上,将输入验证(类型检查只是一种输入验证。还有范围检查等)尽可能靠近实际使用输入的地方。在您的情况下,这似乎是模型-控制器-视图应用程序的模型。根据我对您的示例代码的理解,用户类将是一个模型。

理由:代码会随着时间的推移而发展,您或更糟的是,您的同事在一个地方进行更改而忘记第二个地方的风险会增加。换句话说,如果需要更改,如果代码的相关部分彼此接近,则风险较小。

附加早期检查,例如在 HTML5 级别,使用 javascript 或在控制器级别有其优势,它们甚至可能是必要的,但它们与真正使用输入的代码“相距甚远”,因此我不会放弃较低级别的检查。理想情况下,实施所有这些检查。如果您的时间很紧,请先牺牲 HTML5 级别检查,然后是任何 javascript 检查,然后是控制器级别检查。但是放弃模型级别的检查是不行的。换句话说,开始在模型级别实施检查,然后实施更高级别的检查。

这符合你的最后一句话:

我真的不喜欢用 type 来膨胀我的控制器的想法 检查。

这也意味着控制器是处理大部分错误的好地方。

旁注:数据库中的输入验证也是如此。这是你的“最后一道防线”。如果那里有不良数据泄漏,纠正措施将非常昂贵。因此,在数据库结构中添加尽可能多的输入验证。在最坏的情况下,这些限制可以稍后放宽,您的数据库将保持干净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2017-07-31
    • 2011-03-07
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多