我正在做一些微优化的基准测试实验,我突然想到了测试类型转换与检查特定数据类型的函数的想法。特别是(int) vs is_numeric()。我的理论观点是,如果我已经确保我的变量确实是一个整数,我就不需要实际检查它。
$a = (int) $_POST['a'];对比:
$v = $_POST['a']; if (is_numeric($v)){ $a = $v; }两个示例中的第一个在大多数情况下执行速度比控制结构快3-4倍。
在这个问题上,有没有人对“最佳实践”有意见?使用类型转换作为验证对于未来的开发来说是不是太草率或者太冒险了?
发布于 2011-11-25 07:40:27
测试某物是否为int和盲目地将任何值转换为int是两码事。使用任何更适合该情况的选项。如果您需要验证用户输入并拒绝无效值,请进行测试。如果您只需要任何整数,即使该值与原始用户输入无关,也可以进行强制转换。性能上的差异应该是最小的,以至于与功能上的差异无关。
发布于 2011-11-25 07:38:22
这不是一个坏主意,但原因并不是你想的那样。它可以保证您从表单中获得的内容始终采用您期望的数据格式。这意味着(对于整型、浮点型和布尔型,字符串是另一回事),没有办法通过以这种方式保护的字段执行SQL注入攻击。这并不意味着数据一定是有效的(负值,只有正值才是有效的,诸如此类),所以您可能仍然需要在强制转换的基础上进行进一步的验证。
就性能而言,您基本上是在谈论微优化。永远不要担心这样的事情,除非你能毫无疑问地证明确实有需求,否则会以一种有意义的方式损害你的应用程序的性能。
发布于 2011-11-25 08:40:37
如果是你的脚本生成POST输入'a',而且它本身永远不会做任何不寻常的事情,我会说只有强制转换就足够了,而且通常是首选的。
大多数用户不知道信息是如何在互联网上传输的,他们不太可能无意中更改您的表单或JavaScript。真正了解POSTS和表单等工作原理的人在处理发送的数据时知道自己在做什么。如果他们的实验会让你的网站产生奇怪的结果,我会说只要结果是无用的(无害的),就没有问题。
如果'a‘是MySQL表中一行的ID,那么如果它们提供了一些奇怪的值,那么最糟糕的事情可能是它们看到另一行,或者根本看不到行。但是,如果有行,而不是每个人都可以看到,那么应该有某种身份验证过程,它应该起作用并阻止对行的访问。
https://stackoverflow.com/questions/8263464
复制相似问题