容易犯错的 PHP 函数

strtotime

date( "Y-m", strtotime( "+1 month",strtotime("2018-01-31")));

你预期的结果是:2018-02,而实际得出的是:2018-03

原因在于二月是没有三十一号,多余的天数会加到三月份。解决方法有两种

第一种:

date( "Y-m", strtotime( "first day of +1 month",strtotime("2018-01-31")));

第二种:

date( "Y-m", strtotime( "+1 month",strtotime("2018-01-01")));

strpos

if(strpos("to be better","better") === TRUE) // 错误,应使用 !== FALSE
if(strpos("to be better","better") === FALSE) 

查看官方文档的解释:
此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。请阅读 布尔类型章节以获取更多信息。> 应使用 === 运算符来测试此函数的返回值。
可以看出 === TRUE 这种判断是错的,应使用 !== FALSE 来判断为真

判断各种空值

使用if判断时, PHP对待:NULL、false、0、 空字符是一样的。
以下为各判断函数对照表:

容易犯错的 PHP 函数

array_merge()和+

array_merge():
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。(你的1567)如果数组包含数字键名(可以试试看,之前折腾死我了),后面的值将不会覆盖原来的值,而是附加到后面。(数字键名会被重新分配,总会变成从零开始的。。)

*对于使用“+”合并数组:
如果数组中有相同的字符串键名(不管是不是数字),则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉。(你的1237)

null合并运算符

在??中,$_GET['user'] 便已经使用了isset
由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalesces can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

使用curl的时候,设置参数应为键值而不是字符串

// 错误的
$config['CURLOPT_URL'] = "https://weburl/index.action";
$config['CURLOPT_VERBOSE'] = 0;
$config['CURLOPT_SSLVERSION'] = 3;
$config['CURLOPT_SSL_VERIFYPEER'] = FALSE;
$config['CURLOPT_SSL_VERIFYHOST'] = 2;
$config['CURLOPT_FOLLOWLOCATION'] = 0;

// 正确的
$config[CURLOPT_URL] = "https://weburl/index.action";
$config[CURLOPT_VERBOSE] = 0;
$config[CURLOPT_SSLVERSION] = 3;
$config[CURLOPT_SSL_VERIFYPEER] = FALSE;
$config[CURLOPT_SSL_VERIFYHOST] = 2;
$config[CURLOPT_FOLLOWLOCATION] = 0;

urlencode与urldecode

urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%,对字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。

urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2
你看我吊吗啊

新手必踩坑

4年前 评论

恩,几前年写排班功能的时候,遇到过,去年在鸟哥的博客里又看到一次

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!