不用加 #!/usr/bin/env php;CLI 下直接 php script.php 即可,该行仅在 Linux/macOS 赋予脚本可执行权限后需要,Windows 不识别;漏掉 php 前缀会导致 shell 解析报错。
PHP CLI 直接运行阶乘函数要加 #!/usr/bin/env php 吗?
不用。CLI 模式下直接执行 php script.php 就行,#!/usr/bin/env php 只在 Linux/macOS 下赋予脚本可执行权限(chmod +x)后才需要。Windows 完全不认这行。重点是别漏掉 php 命令前缀,否则系统会尝试用 shell 解析 PHP 代码,报错类似 syntax error near unexpected token `。
factorial() 递归写法在 CLI 下容易爆栈?
是的。PHP 默认栈深度有限(通常 100 层左右),factorial(200) 就可能触发 Fatal error: Maximum function nesting level of '256' reached(如果开了 xdebug)。生产环境不建议递归算大数阶乘。更稳的做法是迭代:
function factorial($n) {
if ($n < 0 || !is_int($n)) {
throw new InvalidArgumentException('Input must be non-negative integer');
}
$result = 1;
for ($i = 2; $i <= $n; $i++) {
$result *= $i;
}
return $result;
}
- 输入校验必须做,CLI 参数是字符串,
$argv[1]得用(int)或filter_var(..., FILTER_VALIDATE_INT)转换 - 超过
PHP_INT_MAX(通常 2^63−1)后整数会自动转为 float,精度丢失。算factorial(171)就会变 INF —— 这不是 bug,是浮点上限 - 真要算大数阶乘,得用
bcmul()配合循环,或者gmp_fact()(需启用 gmp 扩展)
怎么从命令行传参并验证用户输入?
PHP CLI 的参数存在全局数组 $argv,$argv[0] 是脚本名,第一个参数是 $argv[1]。别直接用 $_GET 或 $_SERVER['argv'] —— 后者不一定存在,且结构不一致。
基础校验示例:
立即学习“PHP免费学习笔记(深入)”;