Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

☯ Insightful PHP Debugging Assistant. Exceeds expectations. PHP 5.1→8.3

License

NotificationsYou must be signed in to change notification settings

php-sage/sage

Repository files navigation

At first glanceSage is just a drop-in replacementforvar_dump()anddebug_backtrace().

However, it's much,much more.


Sage is designed to exceed expectations, it intelligently handles everything that you throw at it and displays in the best possible way.

If you can think of how it can be better, please create an issue!

For an overview of Sage's outstanding features jump to theF.A.Q.

Installation

composer require php-sage/sage --dev

Or if you prefer,download the phar and simply

<?phprequire'sage.phar';sage('Hello, 🌎!');

Or if your PHP version does not support either,download the latest source code and includeSage.php

require'sage-main/Sage.php';sage('Hello, 🌎!');

Usage

sage($GLOBALS,$_SERVER);// dump any number of parameterssaged($i);// alias for sage();die;sage(1);// shortcut for dumping trace
FunctionShorthand
sagesDump (same as\Sage::dump())
sagedsdDump & die
ssagessSimple dump
ssagedssdSimple dump & die
sagetraces(1)Debug backtrace (same as\Sage::trace())

Simple dump:

simple mode example

Debug backtrace:

Trace view

Guarantees ✅

  1. Sagejust works and it displays ALL available information (or in cases when something is truncated - that isclear too).

  2. Eachrelease is vigorously tested. Or - use the bleeding edgedev-mainversion at your own risk.

  3. Semver versioning ensures there's no compatibility breaks if you use it in your production (eg. reporting).

  4. Sage has gotten lots of love and improvements in the last >10 years. It is used by a lot of real people in a lot ofreal-world scenarios, it is battle tested and has a lot of advanced features no other tool has.

More cool stuff

Sage displays the passed variable name and supports prefixes to the dump function call. Use it for some commonon-the-fly adjustments to the dump output.

~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 viewprintsd($var);// saves output into "sage.html" in the current directoryprint !sd($var);// saves output into "sage.html" while also ignoring the output depth limit!

Sage tokenizes & introspects the calling code to get all this information. All that can be done with prefixes can alsobe achieved with standard, verbose syntax:

~ss($var);// is equivalent to:Sage::enabled(Sage::MODE_TEXT_ONLY);Sage::dump($var);

SeeAdvanced section below if you want more tips & tricks.

Verbose versions

If you want to use Sage as part of permanent code (e.g. part of a test helper/logger/exception reporter etc), you canuse the verbose way to invoke 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{publicfunctiongetVarDump(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 defaultsreturnPHP_EOL .$debugOutput;  }}

Customization

The main goal of Sage is to bezero-setup. There are also several customization options for advanced uses.

Where to store the configuration?

  1. Add this entry to theautoload.files configuration incomposer.json:
"autoload":{"files":["config/sage.php"/* <--------------- create this file with your settings! */]}, ...
  1. Put settings inside ofphp.ini:
; change sage theme:sage.theme = solarized-dark; always display all dump levels, almost always crashes the browser:sage.maxLevels = 0; set your IDE linkssage.editor = vscode; disable Sage unless explicitly enabledsage.enabled = 0
  1. Include the desired settings in your bootstrap process anywhere™.
require'sage.phar';Sage::$theme = Sage::THEME_LIGHT;

All available options

Sage::$theme = Sage::THEME_ORIGINAL;

Currently available themes are:

  • Sage::THEME_ORIGINAL
  • Sage::THEME_LIGHT
  • Sage::THEME_SOLARIZED
  • Sage::THEME_SOLARIZED_DARK

Sage::$editor =ini_get('xdebug.file_link_format');

Make visible source file paths clickable to open your editor. Available options are:

'phpstorm-remote' - default (requiresIDE Remote Control plugin),'sublime','textmate','emacs','macvim','phpstorm','idea','vscode','vscode-insiders','vscode-remote','vscode-insiders-remote','vscodium','atom','nova','netbeans','xdebug'

Or pass a custom string where %file should be replaced with full file path, %line with line number to create a customlink. Set to null to disable linking.


Sage::$displayCalledFrom =true;

Whether to display where Sage was called from


Sage::$maxLevels =7;

Max array/object levels to go deep, set to zero/false to disable


Sage::$expandedByDefault =false;

Draw rich output already expanded without having to click


Sage::$cliDetection =true;

Enable detection when running in command line and adjust output format accordingly.


Sage::$cliColors =true;

In addition to above setting, enable detection when Sage is run inUNIX command line. Attempts to add coloring, but ifopened as plain text, the color information is visible as gibberish.


Sage::$charEncodings =  ['UTF-8','Windows-1252','euc-jp' ]

Possible alternative char encodings in order of probability.


Sage::$returnOutput =false;

Sage returns output instead of printing it.


Sage::$aliases;

Add new custom Sage wrapper names. Optional, but needed for backtraces, variable name detection and modifiers to workproperly. Accepts array or comma separated string. Use notationClass::method for methods.


🧙 Advanced Tips & Tricks

this section is under construction :)

// 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 traceSage::trace();s(1);// shorthand works too!s(2);// trace - but just the pathsSage::dump(debug_backtrace() );// you can even pass a custom result from debug_trace and it will be recognized// dump and die debuggingsd($GLOBALS,$_SERVER);// dd() might be taken by your frameworksaged($GLOBALS,$_SERVER);// so this is an equivalent alternativessd($GLOBALS,$_SERVER);// available for plain display too!// this will disable Sage completelySage::enabled(false);sd('Get off my lawn!');// no effect
  • Sage supports keyboard shortcuts! Just pressd when viewing output and the rest is self-explanatory, try itout! (p.s.vim-stylehjkl works as well);

  • CallSage::enabled(Sage::MODE_PLAIN); to switch to a simpler, js-free output.

  • CallSage::enabled(Sage::MODE_TEXT_ONLY); for pure-plain text output which you can save or pass around by firstsettingSage::$returnOutput = true;

  • Sage can provide a plain-text version of its output and does so automatically when invoked via PHP running in commandline mode.

  • Double clicking the[+] sign in the output will expand/collapse ALL nodes;triple clicking a big block of textwill select it all.

  • Clicking the tiny arrow on theright of the output will open it in a separate window where you can keep it forcomparison.

  • Sage supports themes:

    For customization instructions read the section below.

  • If a variable is an object, its classname can be clicked to open the class in your IDE.

  • There are several real-time prefix modifiers you can use (combinations possible):

    PrefixExample
    printPuts output into current DIR as sage.htmlprint sage()
    !Dump ignoring depth limits for large objects! sage()
    ~Simplifies sage output (rich->html->plain)~ sage()
    -Clean up any output before dumping- sage()
    +Expand all nodes (in rich view)+ sage()
    @Return output instead of displaying it@ sage()
  • Sage also includes a naïve profiler you may find handy. It's for determining relatively which code blocks take longerthan others:

  • Sage runs perfectly fine on PHP 5.1 (couldn't find a way to test it on 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)' );


F.A.Q.

💬 How is it different or better thansymfony/var-dumper?

  • VisibleVariable name
  • Keyboard shortcuts. Typed and the rest is just self-explanatory (use arrows, space, tab, enter, you'll getit!).
  • Debug backtraces with full insight of arguments, callee objects and more.
  • Custom display for a lot of recognized types:custom types
  • Has text-only, plain and rich views, has several visual themes - created by a professional designer.
  • A huge number of usability enhancements - like the (clickable)call trace in the footer of each output.
  • Supports convenience modifiers, for example@sage($var); will return instead of outputting,-sage($var);willob_clean all output to be the only thing on page (see advanced section above for more).
  • Compatibility! Fully works onPHP 5.1 - 8.1+!
  • Code is way less complex - to read and contribute to.
  • Sage camefirst - developedsincepre-2012. It inspired thenowubiquitousddshorthand, pioneered a lot of the concepts in the tool niche.

💬 What are the other dumpers out there

💬 Why does Sage look so much like Kint? A.K.A. Why does this repo have so few stars?

Because itis Kint, and I am its author, however the project wasforcibly taken over by amalicious contributor!

Instead of fighting windmills I chose to fork and rename the last good version and continue under a new name!

You can use Sage as a drop-in replacement for Kint. Simple.

💬 How isvar_dump - style debugging still relevant when we have Xdebug?

  1. In practice, Xdebug is quite often very difficult and time-consuming to install and configure.
  2. There's many use-cases where dump&die is just faster to bring up.
  3. There is no way you can visualise a timeline of changed data with XDebug. For example, all values dumped from withina loop.
  4. And there's more subtle use-cases, eg. if you stepped over something there's no way to go back, but with var-dumpingthe values are still there...

I use xdebug almost daily, by the way. Side by side with Sage.

Known issues

  1. Since PHP 8.2 variable name detection formultiline Sage calls is broken. Simple matter of Backtrace formatchanging the reported line, fix is comming.

Contributing

🎲 Prerequisites

  • InstallDocker Compose.
  • If you're onWindows 10+ you need to use WSL2:
    1. Setup:wsl --install
    2. Set Ubuntu as your default wsl shell:wsl --set-version Ubuntu 2.
    3. All commands listed below must be run from inside wsl shell:wsl

Do your changes but before committing run

 docker compose run php composer build# OR (see Makefile): make build

To compile resources and build the phar file.

Author

Rokas Šleinius (Raveren)

Contributors:https://github.com/php-sage/sage/graphs/contributors

License

Licensed under the MIT License


Hope you'll love using Sage as much as I love creating it!

About

☯ Insightful PHP Debugging Assistant. Exceeds expectations. PHP 5.1→8.3

Topics

Resources

License

Stars

Watchers

Forks

Contributors20


[8]ページ先頭

©2009-2026 Movatter.jp