博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
由in_array()函数引发的对PHP比较运算中自动转型的思考
阅读量:4114 次
发布时间:2019-05-25

本文共 1341 字,大约阅读时间需要 4 分钟。

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 转换为 "",进行数字或词汇比较
任何其它类型 转换为 FALSE <TRUE
内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的
将字符串和资源转换成数字,按普通数学比较
具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)
任何其它类型 总是更大
任何其它类型 总是更大
显然,这里命中了第二条规则,因为调用者传入的是字符串,一旦和这个true进行比较时,字符串只要是非空,那么比较前就会自动转为bool值的true,当然true==true。
对此的简化模型如下:
in_array(任何非空字符串,array(元素1,元素2...., true));
此函数总是返回true。

3 总结体会

(1)使用PHP函数时,一定要弄清楚其正确的含义,比如这里的in_array就应该改成array_key_exists.
(2)PHP这种软类型的自动类型转换非常频繁,需要倍加注意。其实in_array()里也对此提供了第三个可选参数,来进一步确定是否使用===而不是==。

转载地址:http://mazpi.baihongyu.com/

你可能感兴趣的文章
python猜拳游戏
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
ESP8266 WIFI数传 Pixhaw折腾笔记
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
python __future__
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(二)
查看>>
pytorch(三)
查看>>
pytorch(四)
查看>>
pytorch(5)
查看>>
pytorch(6)
查看>>
ubuntu相关
查看>>