随着版本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调用它.我真的不喜欢用类型检查来控制我的控制器的想法.
解决方法:
我相信这个问题的任何答案都会在一定程度上得到澄清,如果它真的适合stackoverlow,我们处于一个灰色地带.不过,我会尽量回答客观的问题.
根据我的经验,与任何其他考虑因素(如运行时性能或可维护性)相比,稳健性是更高优先级,这将从更好的开发人员文档中受益.
基于此,保持输入验证(类型检查只是一种输入验证.还有范围检查等)尽可能接近实际使用输入的地方.在您的情况下,这似乎是模型 – 控制器 – 视图应用程序的模型.根据我对您的示例代码的理解,用户类将是一个模型.
理由:代码会随着时间的推移而发展,你或者更糟的风险是,你的同事在一个地方做出改变而忘记第二个地方的增加.换句话说,如果需要进行更改,则如果代码的相关部分彼此接近,则风险会更小.
其他早期检查,例如在HTML5级别,使用javascript或在控制器级别有它们的优点,它们甚至可能是必要的,但它们与输入真正使用的代码“相距甚远”,因此我不会放弃较低级别的检查.理想情况下,实施所有这些检查.如果时间紧迫,首先牺牲HTML5级别检查,然后是任何javascript检查,然后是控制器级别检查.但放弃模型级别检查是不行的.换句话说,开始在模型级别实施检查,然后实现更高级别的检查.
这适合你的最后一句话:
I don’t really like the idea of bloating out my controllers with type
checking.
这也意味着控制器是大多数错误处理的好地方.
附注:数据库中的输入验证也是如此.这是你的“最后防线”.如果有不良数据泄漏,纠正措施将非常昂贵.因此,尽可能多地将输入验证添加到数据库结构中.在最坏的情况下,这些限制可以在以后放宽,您的数据库将保持清洁.