如果你才寫過一段時(shí)間 的PHP,就會(huì)發(fā)現(xiàn)一個(gè)看似“隨意”的現(xiàn)象:不同函數(shù)的參數(shù)順序似乎沒有統(tǒng)一的規(guī)律。尤其在記憶和使用一些常見函數(shù)時(shí),你可能會(huì)反復(fù)在“這個(gè)是 $needle, $haystack
嗎?還是 $haystack, $needle
?”之間犯嘀咕。
這種混亂并不是你的錯(cuò),而是 PHP 的歷史包袱。畢竟 PHP 是一個(gè)粘合了數(shù)百個(gè)外部庫的語言,每個(gè)擴(kuò)展、每個(gè)函數(shù)庫都有各自的風(fēng)格。 于是放在一起,就顯得有點(diǎn)“不一致”。不過我們還是可以總結(jié)出一些簡(jiǎn)單的規(guī)律,幫你快速分辨。
1. 數(shù)組函數(shù):needle, haystack
在數(shù)組相關(guān)的函數(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"
為什么會(huì)這樣?因?yàn)楹芏嘧址瘮?shù)的實(shí)現(xiàn)來自 C 標(biāo)準(zhǔn)庫(如 strstr
、strchr
),而它們的習(xí)慣就是把“原始字符串”放前面。PHP 延續(xù)了這個(gè)傳統(tǒng)。
3. 參數(shù)順序的混亂與“隨機(jī)性”
嚴(yán)格來說,PHP 的參數(shù)順序 不是隨機(jī)的,而是受歷史和外部庫影響的結(jié)果。數(shù)組和字符串兩類函數(shù)的規(guī)律,基本能覆蓋 80% 的情況。但還是會(huì)有一些“不走尋常路
”的例子:
array_map($callback, $array1, $array2...);preg_match($pattern, $subject);
這里 preg_match
又采用了 “needle, haystack” 的風(fēng)格(正則表達(dá)式先寫)。所以實(shí)際用的時(shí)候,還是要對(duì)常用函數(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");
這樣寫不僅更清晰,還能自由調(diào)整順序:
str_replace( subject: "hello world", replace: "PHP", search: "world");
效果完全一樣,而且還能跳過一些帶默認(rèn)值的參數(shù)。
命名參數(shù)在復(fù)雜函數(shù)里尤其有用,比如:
htmlspecialchars( string: $input, double_encode: false);
是不是一下子變得自解釋了?
5. 小結(jié)
PHP 的函數(shù)參數(shù)順序并不是“隨機(jī)”的,而是歷史遺留和不同底層庫習(xí)慣的產(chǎn)物。簡(jiǎn)單記憶規(guī)則是:
- ? 數(shù)組函數(shù): needle, haystack
- ? 字符串函數(shù): haystack, needle
如果還是記不???那就用 PHP 8+ 的命名參數(shù),讓代碼更直觀,也不怕寫錯(cuò)。
寫作不易,希望您動(dòng)動(dòng)發(fā)財(cái)?shù)男∈?,幫忙一鍵三連(點(diǎn)贊、推薦、關(guān)注),您的鼓勵(lì),就是我寫作的動(dòng)力!