由in_array()函数引发的对PHP比较运算中自动转型的思考
2013-01-25 11:05
120 查看
1 问题起源
问题源于细说PHP的教学视频:PHP设计超级好用的文件上传处理类。视频中在构造函数中采用了数组来传参数,然后根据这些参数名是否是类的成员名来给成员赋值。代码片段如下:1 <?php
2 class FileUpload
3 {
4 //指定上传路径,允许的类型,限制文件大小,是否使用随机文件名
5 private $file_path;
6 private $allowed_types = array('gif', 'png', 'jpg', 'jpeg');
7 private $max_size = 100000;
8 private $name_random = true;
9
10 function __construct($options) {
11 foreach($options as $key=>$value) {
12 $key = strtolower($key);
13 $vars = get_class_vars(get_class($this));
14 if(!in_array($key, $vars)) {
15 continue;
16 }
17 $this->$key = $value;
18 }
19 }
20
21 function __destruct() {
22 }
23 }
首先说明的是,这里不应该使用in_array(),因为in_array是判断数组元素的值而不是元素的索引键值,这一点在《细说PHP》第二版371页已经改成是array_key_exists了。
然而上述函数在这里却歪打正着地好用,因为实际上,无论传入什么样的参数,均会在第14行中的in_array()返回true,我们要分析的就是为什么总返回true。
2 原因分析
问题就出在了第8行,这里有一个成员的值是true。PHP在做比较时,当进行比较的两个值类型不同的时候,会自动转型,规则如下:null 或string | string | 将 NULL转换为 "",进行数字或词汇比较 |
bool 或null | 任何其它类型 | 转换为 bool,FALSE< TRUE |
object | object | 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明 |
string,resource 或number | string,resource 或number | 将字符串和资源转换成数字,按普通数学比较 |
array | array | 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例) |
array | 任何其它类型 | array 总是更大 |
object | 任何其它类型 | object 总是更大 |
对此的简化模型如下:
in_array(任何非空字符串,array(元素1,元素2...., true));
此函数总是返回true。
3 总结体会
(1)使用PHP函数时,一定要弄清楚其正确的含义,比如这里的in_array就应该改成array_key_exists.(2)PHP这种软类型的自动类型转换非常频繁,需要倍加注意。其实in_array()里也对此提供了第三个可选参数,来进一步确定是否使用===而不是==。
相关文章推荐
- 由php的call_user_func传reference引发的思考
- PHP_EOL引发的思考
- 由php的call_user_func传reference引发的思考
- php in_array函数引发的一些思想
- PHP:由一些小问题引发的思考
- PHP 的比较运算与逻辑运算详解
- 通过JavaScript 柯里化求加法运算引发的对JavaScript类型转换的思考
- zookeeper中的自动交互引发的思考
- 一道习题引发的思考——Java字符运算
- 自动安装lamp架构的shell脚本,版本都比较新,php5.3.8
- PHP 的比较运算与逻辑运算详解
- PHP中如何保持SESSION以及由此引发的一些思考
- iOS一个'initWithRequest:delegate:' is deprecated: first deprecated in iOS 9.0 - Use NSURLSession (see NSURLSession.h) Warning引发的思考
- 如何在PHP中保持SESSION以及由此引发的一些思考
- php 日期时间运算比较
- display:inline-block引发的间隙思考
- PHP 中「自增、自减」运算引发的奇怪问题
- PHP 的比较运算与逻辑运算
- PHP 的比较运算与逻辑运算 的一些坑
- 美国两起并购引发思考:传统行业转型及创业机会何在?