容易犯錯的 PHP 函式

mel123發表於2019-07-05

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 協議》,轉載必須註明作者和本文連結

相關文章