
如果你才写过一段时间 的PHP,就会发现一个看似"随意"的现象:不同函数的参数顺序似乎没有统一的规律。尤其在记忆和使用一些常见函数时,你可能会反复在"这个是 $needle, $haystack
吗?还是 $haystack, $needle
?"之间犯嘀咕。
这种混乱并不是你的错,而是 PHP 的历史包袱。毕竟 PHP 是一个粘合了数百个外部库的语言,每个扩展、每个函数库都有各自的风格。 于是放在一起,就显得有点"不一致"。不过我们还是可以总结出一些简单的规律,帮你快速分辨。
1. 数组函数:needle, haystack
在数组相关的函数里,大多数采用的是 "针在前,草堆在后" 的顺序。比如:
perl
in_array('apple', ['apple', 'banana', 'orange']);
// needle = 'apple', haystack = [...]
再比如:
css
array_search('b', ['a', 'b', 'c']);
// needle = 'b', haystack = [...]
这样记:你要在一堆草里找针,自然是先说"针",再说"草堆"。
2. 字符串函数:haystack, needle
到了字符串函数,顺序就反了。绝大多数字符串函数用的是 "草堆在前,针在后" 。比如:
ini
strpos("hello world", "world");
// haystack = "hello world", needle = "world"
或者:
ini
strstr("hello world", "world");
// haystack = "hello world", needle = "world"
为什么会这样?因为很多字符串函数的实现来自 C 标准库(如 strstr
、strchr
),而它们的习惯就是把"原始字符串"放前面。PHP 延续了这个传统。
3. 参数顺序的混乱与"随机性"
严格来说,PHP 的参数顺序 不是随机的 ,而是受历史和外部库影响的结果。数组和字符串两类函数的规律,基本能覆盖 80% 的情况。但还是会有一些"不走寻常路
"的例子:
bash
array_map($callback, $array1, $array2...);
preg_match($pattern, $subject);
这里 preg_match
又采用了 "needle, haystack" 的风格(正则表达式先写)。所以实际用的时候,还是要对常用函数形成"肌肉记忆
"。
4. PHP 8+ 命名参数的出现
在 PHP 8.0 之前,参数顺序混乱只能靠记忆或文档。好消息是,从 PHP 8+ 开始,我们可以使用 命名参数(Named Arguments) ,完全绕过"顺序焦虑"。
语法非常直观:
less
str_replace(
search: "world",
replace: "PHP",
subject: "hello world"
);
这样写不仅更清晰,还能自由调整顺序:
less
str_replace(
subject: "hello world",
replace: "PHP",
search: "world"
);
效果完全一样,而且还能跳过一些带默认值的参数。
命名参数在复杂函数里尤其有用,比如:
php
htmlspecialchars(
string: $input,
double_encode: false
);
是不是一下子变得自解释了?
5. 小结
PHP 的函数参数顺序并不是"随机"的,而是历史遗留和不同底层库习惯的产物。简单记忆规则是:
- • 数组函数:
needle, haystack
- • 字符串函数:
haystack, needle
如果还是记不住?那就用 PHP 8+ 的命名参数,让代码更直观,也不怕写错。