PHP 函数的参数顺序,它们是随机的吗?

如果你才写过一段时间 的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 标准库(如 strstrstrchr),而它们的习惯就是把"原始字符串"放前面。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+ 的命名参数,让代码更直观,也不怕写错。

相关推荐
Apifox.32 分钟前
测试用例越堆越多?用 Apifox 测试套件让自动化回归更易维护
运维·前端·后端·测试工具·单元测试·自动化·测试用例
sunnyday04261 小时前
Nginx与Spring Cloud Gateway QPS统计全攻略
java·spring boot·后端·nginx
康王有点困1 小时前
Link入门
后端·flink
海南java第二人1 小时前
Spring Boot全局异常处理终极指南:打造优雅的API错误响应体系
java·spring boot·后端
小楼v2 小时前
消息队列的核心概念与应用(RabbitMQ快速入门)
java·后端·消息队列·rabbitmq·死信队列·交换机·安装步骤
小北方城市网2 小时前
接口性能优化实战:从秒级到毫秒级
java·spring boot·redis·后端·python·性能优化
鸡蛋豆腐仙子2 小时前
Spring的AOP失效场景
java·后端·spring
小北方城市网2 小时前
SpringBoot 全局异常处理最佳实践:从混乱到规范
java·spring boot·后端·spring·rabbitmq·mybatis·java-rabbitmq
qq_256247052 小时前
如何系统性打造高浏览量视频号内容
后端
码界奇点2 小时前
基于Spring Boot与Vue.js的连锁餐饮点餐系统设计与实现
vue.js·spring boot·后端·毕业设计·源代码管理