推荐按项目安装PsySH:运行composer require psy/psysh --dev,通过vendor/bin/psysh(Linux/macOS)或vendor\bin\psysh.bat(Windows)启动,并用get_defined_vars()注入变量以加载项目类和对象。

用 composer require 安装 PsySH 到项目里
PsySH 不是全局工具,推荐按项目安装,避免版本冲突和权限问题。直接运行 composer require psy/psysh --dev 即可,--dev 表示只在开发环境启用,生产部署时不会带上它。
常见错误现象:command not found: psysh —— 这说明没加 --dev 或者没执行 vendor/bin/psysh;也可能是 Windows 下没配置好 PATH,但更简单的方式是别依赖全局命令。
- 安装后入口脚本固定为
vendor/bin/psysh(Linux/macOS)或vendor\bin\psysh.bat(Windows) - 如果项目用了 Composer 的
autoload-dev,PsySH 会自动加载你的类和测试代码,无需额外配置 - 不建议用
composer global require:不同 PHP 版本、不同项目可能需要不同版本的 PsySH,全局装容易踩兼容性坑
启动 PsySH 后怎么加载当前项目的类和变量
默认启动 vendor/bin/psysh 是个空壳,看不到你写的类、$app、$container 这些东西。必须显式告诉它“载入上下文”。
最常用做法是加 -c 参数指定配置文件,或者用 --extra 注入变量。但对入门用户来说,更直接的是写一个启动脚本:
立即学习“PHP免费学习笔记(深入)”;
#!/usr/bin/env php
<?php
require __DIR__ . '/vendor/autoload.php';
// 这里手动初始化你常用的对象,比如 Laravel 的 $app,Symfony 的 $kernel
$app = require __DIR__ . '/bootstrap/app.php';
$container = $app->make('Illuminate\Container\Container');
// 然后启动 PsySH 并注入
\Psy\Shell::debug(get_defined_vars());
这样进到交互环境后,$app 和 $container 就能直接用了。
- 别指望
psysh自动识别框架启动逻辑,它不读index.php或public/index.php -
get_defined_vars()是关键,它把当前作用域所有变量传给 PsySH;漏掉这步就只能看到空环境 - 如果用 Laravel,注意
app()辅助函数在 PsySH 里不可用,得提前赋值给变量再传进去
为什么 dump() 和 dd() 在 PsySH 里不生效
因为 PsySH 自带 dump()(来自 Psy\VarDumper),它和 Laravel 的 dump() 冲突了。一旦你 use Illuminate\Support\Facades\Debug 或引入了框架的辅助函数,就会报 Fatal error: Cannot redeclare dump()。
解决办法不是禁用框架函数,而是绕开重名:
- 用全限定名:写
\dump($var)调用 PHP 原生的(PHP 7.4+),或\Illuminate\Support\Debug::dump($var) - 改用 PsySH 原生命令:
ls $obj查属性、doc $obj->method看文档、show $obj->method看源码 - 别在 PsySH 里执行
dd()—— 它会直接 exit,导致整个 shell 退出,没法继续调试
退出 PsySH 时要注意未保存的临时状态
PsySH 的所有变量、函数定义、类别名(alias)都只存在于当前会话内存里。关掉终端就全丢,不会写回文件,也不影响 vendor 或 src。
这意味着你不能靠它“持久化调试逻辑”。比如你写了段模拟请求的代码:
$response = $http->post('/api/login', ['email' => 'a@b.c']);
这段没问题,但下次启动还得重写。如果经常要用,应该把它写成一个独立的 CLI 命令或 PHPUnit 测试方法,而不是反复在 PsySH 里敲。
容易被忽略的一点:PsySH 会缓存已加载的类定义,如果你在调试中途改了某个类的源码,reload 命令不一定能完全刷新——最稳妥的方式是退出重进。











