【发布时间】: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...并看看会发生什么。听起来这会给你两全其美,而无需一次重新设计太多。也就是说,我们现在肯定会转向基于意见的。