
字符串处理函数怎么选 str_replace 还是 preg_replace
直接看场景:要批量替换固定文本,用 str_replace;要按模式(比如“所有数字开头的单词”)替换,才上 preg_replace。前者快、安全、无正则开销;后者灵活但容易写错模式,还可能触发 PREG_BACKTRACK_LIMIT_ERROR。
常见错误是拿 preg_replace 当 str_replace 用——比如只替一个固定字符串,却写了 "/abc/",结果被特殊字符(.、+、[)坑到,或者忘了加定界符报 Warning。
-
str_replace支持数组批量替换,顺序执行,不回溯 -
preg_replace的模式必须有分隔符,常用/或#,记得用preg_quote()转义用户输入的搜索内容 - 性能差十倍以上:简单替换用
str_replace,别为“看起来高级”换正则
数组操作绕不开的三个函数:array_merge、array_merge_recursive、+ 运算符
它们看着都能“合并数组”,但行为完全不同,混用会导致键丢失或结构塌陷。
典型翻车现场:用 + 合并两个带数字键的数组,后边的完全被忽略;或者用 array_merge 合并关联数组时,同名键直接覆盖,而你其实想要递归合并子数组。
立即学习“PHP免费学习笔记(深入)”;
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化 。Scala的Case Class及其内置的模式匹配相当于函数式编程语言中常用的代数类型(Algebraic Type)。 Scala课堂是Twitter启动的一系列讲座,用来帮助有经验的工程师成为高效的Scala 程序员。Scala是一种相对较新的语言,但借鉴了许多熟悉的概念。因此,课程中的讲座假设听众知道这些概念,并展示了如何在Scala中使用它们。我们发现
-
array_merge($a, $b):数字键重排,字符串键后者覆盖前者 -
array_merge_recursive($a, $b):同名键不覆盖,自动包成数组(哪怕值是字符串) -
$a + $b:左操作数优先,右操作数中已存在的键被丢弃,数字键也按字面保留(不重排)
时间处理别硬刚 strtotime,优先用 DateTime 类
strtotime 表面简单,实际对模糊输入(比如 "last Monday"、"next month")依赖系统时区和 locale,跨环境行为不一致;更麻烦的是它返回 int,出错只给 false,没提示。
而 DateTime 显式控制时区、可捕获异常、支持链式调用,调试时能直接 var_dump 看对象状态。
- 解析不确定格式(如用户输入的日期)务必用
DateTime::createFromFormat(),指定格式比猜安全得多 -
strtotime("2023-02-30")不报错,默默变成 2023-03-02;DateTime::createFromFormat("Y-m-d", "2023-02-30")返回false,且DateTime::getLastErrors()能告诉你哪错了 - 计算时间差用
DateTime::diff(),别自己算秒数再除 86400——闰秒、夏令时、月份天数都得手动兜底
文件操作函数里,file_get_contents 和 fopen 选哪个
小文件(file_get_contents;大文件、需要边读边处理、或要控制超时/上下文(比如带 HTTP header 的请求),必须切到 fopen + fread 流式读取。
踩坑最多的是用 file_get_contents 请求第三方 API,没设超时,卡死整个脚本;或者读 GB 级日志,内存爆掉被 OOM kill。
-
file_get_contents($url, false, stream_context_create([...]))可配超时、header、代理,但仍是全量加载 -
fopen配合stream_set_timeout和循环fread,才能真正控流控时 - 写文件别漏
fclose—— 尤其在异常分支里,否则句柄泄漏,fopen多次后会报Too many open files
json_decode 默认不抛异常,file_get_contents 默认不限制超时,array_key_exists 对 null 键的行为和 isset 不一样。









