10

特定のPHPオブジェクトを処理する場合var_dump()、PHPは、PHPのメモリ制限に達するまで、画面に値を出力し続けます。この例は、SimpleHTMLDOMオブジェクトのダンプです。オブジェクトの子と親をトラバースできるのでvar_dump()、オブジェクトの親を見つけ、次にその子を再帰的に見つけ、次にそれらすべての子の親を見つけ、それらの子を見つけるなど、無限の結果が得られると思います。それはただ続くでしょう。

私の質問は、どうすればこれを回避し、PHPが同じものを繰り返しダンプするのを防ぐことができるかということです。Simple HTML DOMパーサーの例を使用して、子を持たないDOMオブジェクトがあり、それを使用する場合はvar_dump()、オブジェクトをダンプし、DOMツリーをトラバースして、親、祖父母、他の子などをダンプしないようにします。 。

4

3 に答える 3

5

XDebug拡張機能を開発環境にインストールします。これは、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";
   }
}
于 2016-08-10T14:25:10.610 に答える
0

foreachオブジェクトに対して単純にループを実行してみませんか?

PHPドキュメントから:

foreach構造は、配列を反復処理する簡単な方法を提供します。 foreachは配列(およびオブジェクト)でのみ機能し、異なるデータ型の変数または初期化されていない変数で使用しようとするとエラーが発生します。

于 2011-09-01T01:16:29.040 に答える
0

私はこの問題を抱えていて、オブジェクトの内部を見る必要はなく、オブジェクトのクラス名だけを見る必要がなかったので、データをダンプする前にオブジェクトをクラス名に置き換える簡単な関数を作成しました。

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))
于 2019-05-03T21:37:31.963 に答える