必须先确认终端中php命令真实指向PHP 8.3:执行which php应返回/opt/homebrew/bin/php(Apple Silicon)或/usr/local/bin/php(Intel),而非/usr/bin/php;再运行php --ini验证Loaded Configuration File是否为/opt/homebrew/etc/php/8.3/php.ini,最后用php -m | grep mbstring检查关键扩展是否加载。

PHP 8.3 CLI 能直接跑脚本,但必须确认 php 命令调用的是你装的 8.3 版本,而不是系统残留或旧版;否则 php -v 看着对,php script.php 却报错或行为异常。
怎么确认终端里敲的 php 真是 PHP 8.3
很多人卡在这一步:明明 brew install php@8.3 成功了,php -v 却显示 8.1 或 7.4。这不是安装失败,是 shell 没加载对二进制。
- 执行
which php—— Apple Silicon 必须输出/opt/homebrew/bin/php,Intel Mac 是/usr/local/bin/php;若显示/usr/bin/php,说明还在用 macOS 废弃的系统 PHP - 执行
php --ini—— “Loaded Configuration File” 行不能是(none),必须指向类似/opt/homebrew/etc/php/8.3/php.ini的路径 - 执行
php -m | grep mbstring—— 如果没输出,说明扩展根本没加载,php.ini没生效或没启用extension=mbstring
php -r 执行单行代码时的常见翻车点
php -r 看似简单,但在 PHP 8.3 下容易因语法细节报错,尤其涉及类型推导或短数组写法。
- 字符串必须用双引号包裹,且内部不能有
<?php标签:php -r "echo 'hello';"✅,php -r "<?php echo 'hello';"❌ - 变量和函数调用要严格符合 PHP 8.3 语法:例如
php -r "$a = 5; echo $a ** 2;"(**是幂运算符,PHP 5.6+ 支持),但php -r "fn() => 42;"会报错,因为箭头函数需上下文,-r不支持纯表达式函数定义 - 中文或特殊字符未转义会导致解析失败:
php -r "echo '你好';"在某些终端编码下会乱码或中断,建议先设LANG=en_US.UTF-8或改用文件方式
运行本地脚本时 $argv 和工作目录的陷阱
PHP CLI 没有 Web 环境的自动路径解析,$argv 的索引、当前目录、相对路径全靠你手动对齐。
立即学习“PHP免费学习笔记(深入)”;
-
$argv[0]是脚本路径(可能是相对路径),$argv[1]才是第一个传参;如果执行php tools/clean.php --dry-run,$argv[1]是--dry-run,不是tools/clean.php - 脚本内用
__DIR__或getcwd()判断路径,别依赖“当前终端在项目根目录”这种假设;例如require 'vendor/autoload.php'在子目录执行会失败,应改用require __DIR__ . '/vendor/autoload.php' - CLI 下
$_SERVER['SCRIPT_FILENAME']不可靠,它可能为空或为-(stdin);判断是否 CLI 应用php_sapi_name() === 'cli',而非检查$_SERVER
为什么 php -S 内置服务器在 PHP 8.3 下更值得优先用
本地开发不用硬配 Apache/Nginx,php -S 是最轻量、最不易出端口/权限冲突的方式,且 PHP 8.3 对路由逻辑做了稳定性加固。
- 启动命令就是
php -S localhost:8000,它会自动找当前目录下的router.php;没有则直接映射静态文件 -
router.php必须返回bool:返回true表示已处理请求(如返回 JSON),返回false表示交由内置服务器处理静态资源 - 注意
php -S不加载php.ini里的opcache或zlib,它只启用 CLI 模式基础扩展;调试时别指望它复现 FPM 下的缓存行为
最常被忽略的一点:PHP 8.3 CLI 默认关闭 display_errors,哪怕语法错误也不会输出——必须在 php.ini 里明确设 display_errors = On,否则 php script.php 静默失败,你得靠 php -l script.php 手动语法检查。



















