php命令调用的未必是8.3,需通过which php/where php确认路径,并用php --ini验证配置文件是否加载正确;CLI下$argv[0]为脚本路径,$argv[1]起才是参数,路径应使用__DIR__拼接而非相对路径,判断SAPI须用php_sapi_name() === 'cli'。

php命令到底调用的是不是8.3
很多人执行php -v看到8.3.x就以为万事大吉,结果php script.php报错或行为异常——根本原因在于终端里敲的php根本不是你装的8.3。macOS上尤其常见:which php返回/usr/bin/php说明还在用系统废弃版本;Apple Silicon必须是/opt/homebrew/bin/php,Intel Mac是/usr/local/bin/php。验证配置是否生效:运行php --ini,看“Loaded Configuration File”行是否指向/opt/homebrew/etc/php/8.3/php.ini(或对应路径),不能是(none)。
直接运行脚本时$argv和路径怎么对得上
CLI下没有Web环境的自动路径解析,$argv[0]是脚本路径(可能是相对路径),$argv[1]才是第一个业务参数。比如执行php tools/clean.php --dry-run,$argv[1]是--dry-run,不是tools/clean.php。脚本内别依赖当前终端所在目录,用__DIR__拼接路径:require __DIR__ . '/vendor/autoload.php'比require 'vendor/autoload.php'可靠得多。$_SERVER['SCRIPT_FILENAME']在CLI下可能为空或为-,判断是否CLI请用php_sapi_name() === 'cli'。
php -r跑单行代码为什么总报错
php -r对语法和编码很敏感,不是所有PHP 8.3语法都能直接用。字符串必须用双引号包裹,且不能含<?php 标签:php -r "echo 'hello';"✅,php -r "<?php echo 'hello';"❌。箭头函数fn() => 42在-r中不支持,会报错。中文字符未转义易导致乱码或中断,建议先设LANG=en_US.UTF-8,或干脆改用文件方式执行。幂运算符**可用:php -r "$a = 5; echo $a ** 2;"输出25。
错误不显示?调试开关怎么开
CLI默认开启display_errors,但如果你改过php.ini或用了-c指定配置,就可能看不到报错。临时强制显示:加-d display_errors=1,如php -d display_errors=1 script.php。更稳妥是在脚本开头加三行:error_reporting(E_ALL);、ini_set('display_errors', 1);、ini_set('log_errors', 0);。注意CLI下别让错误写进error_log,容易丢失。
立即学习“PHP免费学习笔记(深入)”;
真正卡住人的从来不是语法细节,而是which php和php --ini这两条命令没跑对——版本和配置文件没对齐,后面所有操作都在旧环境里打转。



















