如果你才寫過一段時間 的PHP,就會發(fā)現一個看似“隨意”的現象:不同函數的參數順序似乎沒有統(tǒng)一的規(guī)律。尤其在記憶和使用一些常見函數時,你可能會反復在“這個是 $needle, $haystack
嗎?還是 $haystack, $needle
?”之間犯嘀咕。
這種混亂并不是你的錯,而是 PHP 的歷史包袱。畢竟 PHP 是一個粘合了數百個外部庫的語言,每個擴展、每個函數庫都有各自的風格。 于是放在一起,就顯得有點“不一致”。不過我們還是可以總結出一些簡單的規(guī)律,幫你快速分辨。
1. 數組函數:needle, haystack
在數組相關的函數里,大多數采用的是 “針在前,草堆在后” 的順序。比如:
in_array('apple', ['apple', 'banana', 'orange']); // needle = 'apple', haystack = [...]
再比如:
array_search('b', ['a', 'b', 'c']); // needle = 'b', haystack = [...]
這樣記:你要在一堆草里找針,自然是先說“針”,再說“草堆”。
2. 字符串函數:haystack, needle
到了字符串函數,順序就反了。絕大多數字符串函數用的是 “草堆在前,針在后”。比如:
strpos("hello world", "world"); // haystack = "hello world", needle = "world"
或者:
strstr("hello world", "world"); // haystack = "hello world", needle = "world"
為什么會這樣?因為很多字符串函數的實現來自 C 標準庫(如 strstr
、strchr
),而它們的習慣就是把“原始字符串”放前面。PHP 延續(xù)了這個傳統(tǒng)。
3. 參數順序的混亂與“隨機性”
嚴格來說,PHP 的參數順序 不是隨機的,而是受歷史和外部庫影響的結果。數組和字符串兩類函數的規(guī)律,基本能覆蓋 80% 的情況。但還是會有一些“不走尋常路
”的例子:
array_map($callback, $array1, $array2...);preg_match($pattern, $subject);
這里 preg_match
又采用了 “needle, haystack” 的風格(正則表達式先寫)。所以實際用的時候,還是要對常用函數形成“肌肉記憶
”。
4. PHP 8+ 命名參數的出現
在 PHP 8.0 之前,參數順序混亂只能靠記憶或文檔。好消息是,從 PHP 8+ 開始,我們可以使用 命名參數(Named Arguments),完全繞過“順序焦慮”。
語法非常直觀:
str_replace( search: "world", replace: "PHP", subject: "hello world");
這樣寫不僅更清晰,還能自由調整順序:
str_replace( subject: "hello world", replace: "PHP", search: "world");
效果完全一樣,而且還能跳過一些帶默認值的參數。
命名參數在復雜函數里尤其有用,比如:
htmlspecialchars( string: $input, double_encode: false);
是不是一下子變得自解釋了?
5. 小結
PHP 的函數參數順序并不是“隨機”的,而是歷史遺留和不同底層庫習慣的產物。簡單記憶規(guī)則是:
- ? 數組函數: needle, haystack
- ? 字符串函數: haystack, needle
如果還是記不???那就用 PHP 8+ 的命名參數,讓代碼更直觀,也不怕寫錯。
寫作不易,希望您動動發(fā)財的小手,幫忙一鍵三連(點贊、推薦、關注),您的鼓勵,就是我寫作的動力!