Kint是一個超級加強版的var_dump,使用很簡單:
<?php
Kint::dump($GLOBALS, $_SERVER);
除此以外掰茶,Kint還支持用modifier改變輸出的結果:
<?php
+Kint::dump($data); // Disabled depth limit
!Kint::dump($data); // Expand all data in this dump automatically
@Kint::dump($data); // Return the output of this dump instead of echoing it
...
雖然這是PHP的語法坯墨,但是一個函數(shù)怎樣根據(jù)函數(shù)調用前的符號改變自己的行為呢?
想起之前寫過一個輸出變量和類型的函數(shù):
function var_types() {
$bt = debug_backtrace()[0];
$file = new \SPLFileObject($bt['file']);
$file->seek($bt['line'] - 1);
$line = $file->current();
$matchs = null;
preg_match('/var_types\((.*)\)/', $line, $matchs);
$param_names = array_map('trim', explode(",", $matchs[1]));
$args = func_get_args();
for ($i = 0; $i < count($args); $i++) {
echo $param_names[$i] . ' ' . gettype($args[$i]) . PHP_EOL;
}
}
原理是通過debug_backtrace
拿到函數(shù)調用的位置(文件+行數(shù))麻养,然后去解析文件越庇。通常用PHP(而不是C擴展)實現(xiàn)var_dump
罩锐,都是類似的方法。Kint也不例外卤唉,只是它的解析更強大:SourceParser.php唯欣。