[英]PHP - non-recursive var_dump?
在處理某些PHP對象時,可以執行var_dump()
並且PHP將值打印到屏幕上,然后繼續打開,直到達到PHP內存限制為止。 一個例子是轉儲Simple HTML DOM對象。 我假設因為你能夠遍歷對象的子對象和父對象,所以做var_dump()
會給出無限的結果,因為它找到一個對象的父對象,然后遞歸地找到它的子對象然后找到所有這些孩子的父對象並找到那些孩子等等。等等。它會繼續下去。
我的問題是,你怎么能避免這種情況並讓PHP不要一遍又一遍地傾銷掉同樣的東西? 使用Simple HTML DOM解析器示例,如果我有一個沒有子節點的DOM對象而且我有var_dump()
它,我希望它只是轉儲對象而沒有開始遍歷DOM樹並轉儲父母,祖父母,其他孩子等
在開發環境中安裝XDebug擴展。 它將var_dump替換為自己的var_dump,默認情況下只有3個成員。
https://xdebug.org/docs/display
它將顯示4個級別的項目作為省略號。 您可以使用ini設置更改深度。
所有PHP函數:var_dump,var_export和print_r都不跟蹤遞歸/循環引用。
編輯:
如果你想以艱難的方式去做,你可以編寫自己的功能
print_rr($thing, $level=0) {
if ($level == 4) { return; }
if (is_object($thing)) {
$vars = get_object_vars($thing);
}
if (is_array($thing)) {
$vars = $thing;
}
if (!$vars) {
print " $thing \n";
return;
}
foreach ($vars as $k=>$v) {
if (is_object($v)) return print_rr($v, $level++);
if (is_array($v)) return print_rr($v, $level++);
print "something like var_dump, var_export output\n";
}
}
為什么不簡單地在對象上運行foreach
循環?
從PHP文檔 :
foreach構造簡單地提供了一種迭代數組的簡單方法。 foreach僅適用於數組( 和對象 ),並且當您嘗試在具有不同數據類型或未初始化變量的變量上使用它時將發出錯誤。
我遇到了這個問題並且不需要查看對象內部,只需要查看對象類名,因此我在轉儲數據之前編寫了一個簡單的函數來替換對象及其類名:
function sanitizeDumpContent($content)
{
if (is_object($content)) return "OBJECT::".get_class($content);
if (!is_array($content)) return $content;
return array_map(function($node) {
return $this->sanitizeDumpContent($node);
}, $content);
}
然后,當你想要轉儲某些東西時,只需這樣做:
var_dump(sanitizeDumpContent($recursive_content))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.