PHP常见坑和避免的方法
目录
PHP常见坑和避免的方法
filesize缓存的问题
可以用clearstatcache()清除缓存,且不能正确获取大于2G文件的大小
null和空、0、false等四个值的比较
强制只使用===来比较
foreach里的引用赋值
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
避免在foreach中使用引用:
`foreach($a as &$item){}`
isset与empty的联系和区别
-
empty对如下8种情况返回true:
- null
- 空串""
- 字符串0"0"
- 空array
- 布尔值false
- 数字0
- 浮点数0.0
- 类里用var定义但是未赋值
-
isset 检测变量是否设置,并且不是 NULL,但是对于empty的8种情况,只有null返回false,其它7种情况都返回true
综上所述,除了empty描述的的非null的7种情况,在其它情况下, if(empty(变量)) 等效于 if(!isset(变量))
按照函数的本意来使用:
- 想判断变量是否设置,或是否存在于数组中,用isset
- 想判断变量的值是否为空,用empty
含有字符的数字和数字比较有可能为真。
测试如下代码: `'404abc'==404`
强制只使用===来比较
count函数传入字符时,会自动将字符转换为数组将计算。
测试如下代码
```php
count(false)
count(null)
```
浮点运算时应注意丢失精度(PHP遵循IEEE 754双精度)
测试如下代码
```php
floor((0.1+0.7)*10)
intval( 0.58*100 )
var_dump((8 - 6.4) == ##6)
```
数组key如果是数字形式,哪怕以字符串保存也会转成数字
```php
$trMap = [
'baidu' => '百度',
'sougou' => '搜狗',
'360' => '360',
'google' => '谷歌'
];
```
但是PHP给处理成了
```php
array(4) {
["baidu"]=>
string(6) "百度"
["sougou"]=>
string(6) "搜狗"
[360]=>
string(3) "360"
["google"]=>
string(6) "谷歌"
}
```
在使用数组的key时,如果期待是字符串,则全部用(string)key来转换。
空字典json序列化成了[]
因为PHP的关联数组特点。
避免方案:
```php
$ret2 = [
'choices' => [],
'answers' => (object) [],
];
```
什么值在类型转换后为true/false?
下列类型在类型转换后为false,其余均为true:
- 布尔型false
- 整型0
- 浮点型0.0
- 空字符串和字符串"0":特别注意仅包含0的字符串会被转换为false
- 空数组
- null类型变量
- 从空标签创建的SimpleXML对象
最后附上php比较操作符
