macOS 12+ 系统已移除自带 PHP,执行 php -v 会提示 “command not found”,需用 brew install php 安装 PHP 8.x;macOS 11 及更早版本虽自带 PHP 但版本老旧(如 7.3)且可能受 SIP 限制。

Mac 上直接用系统自带的 PHP 就能跑阶乘,不需要额外装环境——但得确认版本够新、没被禁用,且命令行调用路径正确。
怎么确认 Mac 自带 PHP 是否可用
macOS 12(Monterey)及之后版本已移除系统自带 PHP,执行 php -v 会提示 “command not found”。如果你用的是 macOS 12+,php 命令默认不存在,必须手动安装;macOS 11 及更早版本虽自带 PHP,但版本老旧(如 7.3),且可能被 SIP 限制写入扩展目录。
- 运行
which php看是否返回路径(如/usr/bin/php) - 运行
php -v,若报错或显示 7.3/7.4,说明要么没装,要么太旧 - 新版 macOS 推荐用
brew install php(装的是 PHP 8.x),装完后php -v应显示 8.1+,且which php返回类似/opt/homebrew/bin/php
写一个可直接运行的阶乘 PHP 脚本
阶乘逻辑本身极简,但要注意整数溢出和递归深度。PHP 8+ 的 int 在 64 位系统下最大约 9×10¹⁸,所以 factorial(20) 还安全,factorial(25) 就会溢出成负数或科学计数法(取决于是否启用了 gmp 或 bcmath)。
以下是一个带输入校验、避免无限递归的脚本示例(保存为 fact.php):
立即学习“PHP免费学习笔记(深入)”;
#!/usr/bin/env php
\n";
exit(1);
}
$n = (int)$argv[1];
if ($n < 0 || $n > 170) { // 170! 是 float 最大可表示阶乘(约 10³⁰⁶)
echo "Error: n must be between 0 and 170.\n";
exit(1);
}
function factorial($n) {
if ($n <= 1) return 1;
return $n * factorial($n - 1);
}
echo factorial($n) . "\n";运行:php fact.php 5 → 输出 120
为什么不用递归?考虑迭代或 bcmath
递归在 PHP 中默认栈深度有限(通常 100 层左右),factorial(200) 直接触发 Fatal error: Maximum function nesting level。生产环境或大数场景应改用迭代,或启用 bcmath 扩展做任意精度计算。
- 检查是否启用:
php -m | grep bcmath;未启用则需重装 PHP(brew reinstall php --with-bcmath,新版 Homebrew 已默认包含) - 用
bcmul改写:function factorial($n) { $r = '1'; for ($i = 2; $i - 注意:
bcmath函数只接受字符串数字,返回也是字符串,不能直接参与算术运算
真正卡住人的往往不是阶乘逻辑,而是 macOS 版本跳变导致的 PHP 缺失、Homebrew 路径未加入 shell profile、或者脚本里用了 #!/usr/bin/php 却没意识到该路径在新版里根本不存在——这些比算法本身更常引发“跑不起来”。











