php-sage / sage
☯ 深入的 PHP 调试助手。
Requires
- php: >=5.1.0
Requires (Dev)
- pestphp/pest: ^1.0
- seld/phar-utils: ^1.0
- spatie/pest-plugin-snapshots: ^1.0
- symfony/finder: ^3.0 || ^4.0 || ^5.0
- symfony/var-dumper: ^6.1
README
初看之下,Sage 只是 var_dump() 和 debug_backtrace() 的替代品。
然而,它的功能远不止于此。
Sage 被设计用来超越期望,它智能地处理你抛给它的所有内容,并以最佳方式展示。
如果你能想到如何让它变得更好,请创建一个问题!
要了解 Sage 的突出功能,请跳转到 常见问题解答
安装
composer require php-sage/sage --dev
或者,如果你更喜欢,下载 phar 并简单地
<?php require 'sage.phar'; sage('Hello, 🌎!');
或者如果你的 PHP 版本不支持这两个,下载最新源代码 并包含 Sage.php
require 'sage-main/Sage.php'; sage('Hello, 🌎!');
使用方法
sage($GLOBALS, $_SERVER); // dump any number of parameters saged($i); // alias for sage();die; sage(1); // shortcut for dumping trace
简单的转储
调试回溯
保证 ✅
-
Sage 只需工作 并显示所有可用信息(或在某些情况下,如果内容被截断,这也是清晰的)。
-
每个 发布 都经过严格的测试。或者 - 使用具有风险的
dev-main
版本。 -
语义版本确保在生产中(例如,报告)使用时没有兼容性中断。
-
Sage 在过去 >10 年中得到了许多爱和支持以及改进。它在许多真实世界中由许多人使用,经过战斗测试,具有许多其他工具没有的高级功能。
更多酷炫功能
Sage 显示传递的变量名并支持对转储函数调用的前缀。用于对转储输出进行一些常见的即时调整。
~ss($var); // outputs plain text $output = @ss($var); // returns output instead of displaying it ! sage($var); // ignores depth limit for large objects + sage($var); // auto-expands the view print sd($var); // saves output into "sage.html" in the current directory print ! sd($var); // saves output into "sage.html" while also ignoring the output depth limit!
Sage 对调用代码进行标记化并内省以获取所有这些信息。所有可以使用前缀完成的事情也可以使用标准详细语法完成
~ss($var); // is equivalent to: Sage::enabled(Sage::MODE_TEXT_ONLY); Sage::dump($var);
如果你想要更多提示和技巧,请参阅下面的 高级部分
详细版本
如果你想将 Sage 作为永久代码的一部分使用(例如,测试辅助程序/记录器/异常报告程序等),你可以使用详细方式调用 Sage
// instead of sage() Sage::dump('this looks way less hacky (yeah right:)'); // equivalent to sage(1); Sage::trace(); // a real-life test helper: class TestHelper{ public function getVarDump(mixed $providedContext): string { if (! $providedContext) { return ''; } $state = Sage::saveState(); Sage::enabled(Sage::MODE_TEXT_ONLY); Sage::$aliases[] = __CLASS__ . '::' . __FUNCTION__; Sage::$returnOutput = true; Sage::$displayCalledFrom = false; $debugOutput = Sage::dump($providedContext); Sage::saveState($state); // now reset settings to presumed defaults return PHP_EOL . $debugOutput; } }
自定义
Sage 的主要目标是 无配置。也有几个高级使用选项的自定义选项。
在哪里存储配置?
- 将此条目添加到
composer.json
中的autoload.files
配置
"autoload": { "files": [ "config/sage.php" /* <--------------- create this file with your settings! */ ] }, ...
- 将设置放在
php.ini
中
; change sage theme: sage.theme = solarized-dark ; always display all dump levels, almost always crashes the browser: sage.maxLevels = 0 ; set your IDE links sage.editor = vscode ; disable Sage unless explicitly enabled sage.enabled = 0
- 在任何地方™将所需设置包含在启动过程中。
require 'sage.phar'; Sage::$theme = Sage::THEME_LIGHT;
所有可用选项
Sage::$theme = Sage::THEME_ORIGINAL;
目前可用的主题有
Sage::THEME_ORIGINAL
Sage::THEME_LIGHT
Sage::THEME_SOLARIZED
Sage::THEME_SOLARIZED_DARK
Sage::$editor = ini_get('xdebug.file_link_format');
将可见源文件路径显示为可点击以打开您的编辑器。可用选项包括
'phpstorm-remote'
- 默认(需要 IDE 远程控制插件),'sublime'
,'textmate'
,'emacs'
,'macvim'
,'phpstorm'
,'idea'
,'vscode'
,'vscode-insiders'
,'vscode-remote'
,'vscode-insiders-remote'
,'vscodium'
,'atom'
,'nova'
,'netbeans'
,'xdebug'
或者传递一个自定义字符串,其中 %file 应替换为完整文件路径,%line 应替换为行号以创建自定义链接。设置为 null 以禁用链接。
Sage::$displayCalledFrom = true;
是否显示 Sage 被调用的位置
Sage::$maxLevels = 7;
最大数组/对象嵌套层级,设置为 0/假以禁用
Sage::$expandedByDefault = false;
无需点击即可绘制已展开的丰富输出
Sage::$cliDetection = true;
在命令行模式下运行时启用检测并相应地调整输出格式。
Sage::$cliColors = true;
除上述设置外,当 Sage 在 UNIX 命令行中运行时也启用检测。尝试添加颜色,但如果以纯文本打开,颜色信息将显示为乱码。
Sage::$charEncodings = [ 'UTF-8', 'Windows-1252', 'euc-jp' ]
可能的字符编码顺序。
Sage::$returnOutput = false;
Sage 返回输出而不是打印它。
Sage::$aliases;
添加新的自定义 Sage 包装器名称。可选,但对于回溯、变量名检测和修饰符的正常工作是必需的。接受数组或逗号分隔的字符串。使用 Class::method
表示方法。
🧙 高级技巧与窍门
本节正在建设中 :)
// we already saw: sage($GLOBALS, $_SERVER); // you can also go shorter for the same result: s($GLOBALS, $_SERVER); // or you can go the verbose way, it's all equivalent: Sage::dump($GLOBALS, $_SERVER); // ss() will display a more basic, javascript-free display (but with colors) ss($GLOBALS, $_SERVER); // to recap: s() or sage() - dumps. Add "d" to die afterwards: sd(), saged() // preppend "s" to simplify output: ss(), ssage(). // works in combination, too: ssd() and ssagedd() will dump in "simple mode" and die! // prepending a tilde will make the output *even more basic* (rich->basic and basic->plain text) ~d($GLOBALS, $_SERVER); // more on modifiers below // show a trace Sage::trace(); s(1); // shorthand works too! s(2); // trace - but just the paths Sage::dump( debug_backtrace() ); // you can even pass a custom result from debug_trace and it will be recognized // dump and die debugging sd($GLOBALS, $_SERVER); // dd() might be taken by your framework saged($GLOBALS, $_SERVER); // so this is an equivalent alternative ssd($GLOBALS, $_SERVER); // available for plain display too! // this will disable Sage completely Sage::enabled(false); sd('Get off my lawn!'); // no effect
-
Sage 支持键盘快捷键!在查看输出时按 d,其余的都是不言而喻的,试试吧!(提示:vim 风格的
hjkl
也一样有效); -
调用
Sage::enabled(Sage::MODE_PLAIN);
切换到更简单、无 js 的输出。 -
调用
Sage::enabled(Sage::MODE_TEXT_ONLY);
获取纯文本输出,您可以首先设置Sage::$returnOutput = true;
然后保存或传递。 -
Sage 可以提供纯文本版本的输出,并且当通过在命令行模式下运行的 PHP 调用它时自动这样做。
-
双击输出中的
[+]
符号将展开/折叠所有节点;三击一大块文本将选择所有文本。 -
单击输出右侧的小箭头将在单独的窗口中打开它,您可以将其保留以进行比较。
-
Sage 支持主题
有关自定义说明,请参阅下面的部分。
-
如果变量是对象,则可以单击其类名以在您的 IDE 中打开该类。
-
您可以使用几个实时前缀修饰符(可能的组合)
-
Sage 还包括一个您可能觉得有用的简单分析器。它是用来确定相对哪些代码块比其他代码块耗时更长的。
-
Sage 在 PHP 5.1 上运行得很好(找不到测试 5.0 的方法)。
Sage::dump( microtime() ); // just pass microtime() - also works if you pass NOTHING: s(); sleep( 1 ); Sage::dump( microtime(), 'after sleep(1)' ); sleep( 2 ); sd( microtime(), 'final call, after sleep(2)' );
常见问题解答
💬 它与 symfony/var-dumper 有何不同或更好?
- 可见的 变量名
- 键盘快捷键。按 d,其余的都是不言而喻的(使用箭头、空格、制表符、回车,你会明白的!)。
- 调试回溯,具有对参数、被调用对象等的全面洞察。
- 为许多已识别的类型提供自定义显示:
- 有纯文本、纯文本和丰富视图,有多个视觉主题 - 由专业设计师创建。
- 大量易用性改进 - 如每个输出的页脚中的(可点击的)调用跟踪。
- 支持便利修饰符,例如
@sage($var);
将返回而不是输出,-sage($var);
将ob_clean
所有输出,使其成为页面上唯一的内容(有关更多信息,请参阅上述高级部分)。 - 兼容性!完全在 PHP 5.1 - 8.1+ 上工作!
- 代码简单得多 - 读取和贡献。
- Sage 是 首先 出现的 - 从 2012 年之前 开始开发。它启发了现在无处不在的 dd 简写,开创了工具领域中的许多概念。
💬 其他还有哪些转储器
- Symfony/var-dumper
- yii\helpers\VarDumper
- Tracy
- PHP Debug Bar
- Kint - Sage 取代了 Kint。
💬 为什么 Sage 看起来如此像 Kint?即:为什么这个存储库有如此少的星标?
因为它是 Kint,我是它的作者,然而项目却被一个恶意贡献者强行接管了!强行接管!
与其与风车战斗,我选择分叉并重命名最后一个好的版本,并以新名字继续!
您可以使用 Sage 作为 Kint 的直接替代品。很简单。
💬 当我们有 Xdebug 时,为什么使用 var_dump 风格的调试仍然相关?
- 实际上,Xdebug 安装和配置通常非常困难和耗时。
- 有很多用例中,使用 dump&die 更快。
- 您无法使用 XDebug 可视化更改数据的时间线。例如,在循环中输出的所有值。
- 还有更多微妙的使用场景,例如,如果你在某个地方跳过,就无法返回,但是使用 var-dumping 的值仍然存在...
顺便说一下,我几乎每天都使用 xdebug。与 Sage 一起使用。
已知问题
- 由于 PHP 8.2 中多行 Sage 调用的变量名检测已损坏。这只是 Backtrace 格式更改了报告的行,修复即将到来。
贡献
🎲 前提条件
- 安装 Docker Compose。
- 如果您使用的是 Windows 10+,则需要使用 WSL2。
- 设置:
wsl --install
- 将 Ubuntu 设置为默认的 wsl shell:
wsl --set-version Ubuntu 2
。 - 以下所有命令必须在 wsl shell 中运行:
wsl
- 设置:
做你的更改,但在提交之前运行
docker compose run php composer build
# OR (see Makefile):
make build
来编译资源和构建 phar 文件。
作者
罗卡斯·舍利纽斯 (Raveren)
贡献者:https://github.com/php-sage/sage/graphs/contributors
许可证
在 MIT 许可证下授权
希望您使用 Sage 的感觉和我创造它的感觉一样!