当前位置:首页 > php > 正文内容

php中容易出错的小案例

phpmianshi7个月前 (11-26)php248

sprintf


用到sprintf 的时候 如果有传递的变量  如果变量可能出现 % ,则容易出错

<?php

$content = "%')('%s'";
$kind = 11;
$content  = sprintf($content ,$kind);
var_dump($content );

//输出
PHP Warning:  sprintf(): Too few arguments in /home/phpmianshi/test.php on line 5
bool(false)

解决方案:

可以提前转换下 % 为 %%

$content = str_replace('%','%%',$content );



json_encode

json_encode是不支持 resource类型,报错:

PHP Warning:  json_encode(): type is unsupported, encoded as null

$mysql_link = mysql_link();
function test($mysql_link){
    json_encode(func_get_args());
}
test($mysql_link);


strtotime

只要涉及到大小月的最后一天

<?php
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2017-03-31"))));
//输出2017-03-03
var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2017-08-31"))));
//输出2017-10-01
var_dump(date("Y-m-d", strtotime("next month", strtotime("2017-01-31"))));
//输出2017-03-03
var_dump(date("Y-m-d", strtotime("last month", strtotime("2017-03-31"))));
//输出2017-03-03


原理:


1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.

2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1


解决方案:

从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是"first day of" 和 "last day of", 也就是你可以限定好不要让date自动"规范化"

<?php
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2017-03-31"))));
//输出2017-02-28
var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2017-08-31"))));
//输出2017-09-01
var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2017-01-31"))));
//输出2017-02-01
var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2017-03-31"))));
//输出2017-02-28


foreach

foreach循环后留下悬挂指针

$array = [1, 2, 3];

print_r($array);
foreach ($array as &$value) {
}

print_r($array);

foreach ($array as $value) {
}

print_r($array);

#结果:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 2
)

原理:循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用

第一步:复制$arr[0]到$value(注意此时$value是$arr[2]的引用),这时数组变成[1,2,1]

第二步:复制$arr[1]到$value,这时数组变成[1,2,2]
第三步:复制$arr[2]到$value,这时数组变成[1,2,2]

解决方案:

避免这种错误最好的办法就是在循环后立即用unset函数销毁变量 或者 少用引用


isset

对于isset()函数,变量不存在时会返回false,变量值为null时也会返回false

解决方案:

判断一个变量是否真正被设置(区分未设置和设置值为null),array_key_exists()函数或许更好

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

DAL、DAO、ORM、Active Record详解

模型 Model模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑)。一开始我们直接把和数据库相关的代码放在模型里(sql直接写在代码中),这样就会导致以后的维护相当麻烦。业务逻辑的修改都...

PHP7内存优化原理(八)

PHP7内存优化原理(八)

这里面其中的一些主要改变是性能提高的关键,主要有以下内容。1.zval使用栈内存在zend引擎和扩展中,经常要创建php变量,其底层就是一个zval指针,之前的php版本都是通过MAKE_STD_ZV...

Fiddler抓包设置及常见问题

Fiddler抓包设置及常见问题

Fiddler简介官网:https://www.telerik.com/fiddlerFiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够...

php-fpm backlog参数优化

php-fpm backlog参数优化

一、问题分析       1、分析php-fpm.slow.log发现没有执行慢的地方,然后把目光放到了nginx 与php建立连接的阶段上,使用tcpdump...

phpstorm2020.3.1最新永久破解方法

phpstorm又更新了,截至目前为止,官网的最新版本为phpstorm2020.3.1,这次phpstorm的更新UI界面就有了很大的变化,主要是添加了对PHP8的支持,具体的可以去官网去了解哈。同...

laravel中设置数据库读写分离后强制使用主库查询

背景在项目比较火爆,QPS比较高时,可以设置读写分离来扩容数据库,减少数据库的压力,但是有些业务可能对数据一致性要求比较高,比如支付。当支付成功时,再去查询订单状态时,如果查询走的从库,如果出现主从延...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。