值为o会变成空php,转PHP开发时,一些常见的坑 | 学步园

1、null和空、0、false等四个值的比较

在PHP中,== 会先进行类型转换,再进行对比,而===会先比较类型,如果类型不同直接返回不相等,参考如下示例

$a = null;

$b = '';

$c = 0;

$d = false;

echo ($a == $b)?1:0; // 输出1

echo ($a === $b)?1:0; // 输出0

echo ($a == $c)?1:0; // 输出1

echo ($a === $c)?1:0; // 输出0

echo ($b == $c)?1:0; // 输出1

echo ($b === $c)?1:0; // 输出0

echo ($a == $d)?1:0; // 输出1

echo ($a === $d)?1:0; // 输出0

对于我这种以前只写js或C#代码的码农,被这几个值忽悠过n次,n大于3

2、strrchr函数

strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

如果成失败,否则返回 false。

实际上,这个函数是查找某个字符,而不是查找字符串,应该参考官方文档

代码示例:

$a = 'abcdef.txt';

$b = '.php';

echo strrchr($a, $b);

上面的代码输出是:.txt

也就是说,如果$b是字符串,只使用第一个字符,后面的其它字符会忽略

注:php提供了strstr函数,为什么不提供strrstr函数呢,虽然自己实现也很简单

3、foreach里的引用赋值,参见官方文档

这个引用赋值很好哇,对用C#的我,在C#里要修改foreach的元素,是不可能的,是会出异常滴,php把这个变成了可能,但是:

在官方文档里有一句警告:Warning 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

我们看一组代码:

$a = [1,2,3];

foreach($a as &$item){

echo $item . ',';

}

//unset($item); // 引用赋值后不销毁对象

foreach($a as $item){

echo $item . ',';

}

上面的代码的输出如下:

1,2,3,1,2,2  看最后一个输出的是2,而不是3,就是因为代码里没有销毁$item造成的,原因如下:

第一个循环,把3的引用赋给了$item,第二个循环,把1赋给了$item,因为$item是引用,导致数组的元素3变成了1,明白了吗?

4、isset与empty的联系和区别,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(变量))

灵活用法一则:直接访问 $arr['aaa'] 可能报错,说aaa不存在,可以用:

if(isset($arr['aaa']){ 操作代码} 或 if(!empty($arr['aaa']){ 操作代码}

5、trim函数遇到中文空格时,会乱码

$str = '  《前后有全半角空格》  ';

var_dump($str);

$str2 = trim($str, '  ');

var_dump($str2);

$str3 = mb_ereg_replace('^(?:\s| )+|(?:\s| )+$', '', $str);

var_dump($str3);

$str4 = mb_ereg_replace('^[\s ]+|[\s ]+$', '', $str);

var_dump($str4);

参考如上的代码,输出结果:string '  《前后有全半角空格》  ' (length=38)

string '�前后有全半角空格》' (length=28)

string '《前后有全半角空格》' (length=30)

A PHP Error was encountered

Severity: Warning

Message: mb_ereg_replace(): mbregex compile err: invalid code point value

可以看出:trim导致乱码出现了,正则^(?:\s| )+|(?:\s| )+$ 可以正常工作,而正则^[\s ]+|[\s ]+$却编译异常,原因我还没搜索到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值