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