PHP常见坑和避免的方法

PHP常见坑和避免的方法

可以用clearstatcache()清除缓存,且不能正确获取大于2G文件的大小
强制只使用===来比较
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

避免在foreach中使用引用:
`foreach($a as &$item){}`
  • 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`

强制只使用===来比较
测试如下代码

```php
count(false)
count(null)
```
测试如下代码
```php
floor((0.1+0.7)*10)
intval( 0.58*100 )
var_dump((8 - 6.4) == ##6)    
```
```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来转换。
因为PHP的关联数组特点。

避免方案:
```php
$ret2 = [
    'choices' => [],
    'answers' => (object) [],
];
```
下列类型在类型转换后为false,其余均为true:
- 布尔型false
- 整型0
- 浮点型0.0
- 空字符串和字符串"0":特别注意仅包含0的字符串会被转换为false
- 空数组
- null类型变量
- 从空标签创建的SimpleXML对象
![img](img/php-troublesome.png)