2014-05-23 10 views
5

Funkcja "var_dump" w PHP wyprowadza rekurencyjnie właściwości obiektu. Zastanawiam się, czy istnieje sposób "zrzutu" obiektu, ale nie zrzucaj rekursywnych obiektów wewnątrz oryginalnego obiektu.W PHP, czy "var_dump" można zrobić na obiekcie bez uwzględnienia zrzutu obiektów ustawionych na jego właściwości?

Original przegubowe:

object(Class_Name)#1 (3) { 
    ["label":protected]=> 
    string(16) "My Label" 
    ["name":protected]=> 
    string(16) "name" 
    ["object":protected]=> 
    object(Class_Name)#2 (2) { 
    ["id":protected]=> 
    NULL 
    ["classes":protected]=> 
    array(0) { 
    } 
    } 
} 

kupna przegubowe:

object(Class_Name)#1 (3) { 
    ["label":protected]=> 
    string(16) "My Label" 
    ["name":protected]=> 
    string(16) "name" 
    ["object":protected]=> 
    object(Class_Name)#2 (2) { ... } 
} 
+2

trzeba by napisać samemu. var_dump/print_r służą do debugowania i zrzutu WSZYSTKIEGO. jeśli chcesz mniej, musisz to zrobić sam. –

+1

Zobacz rozszerzenie xDebug lub możesz wypróbować coś takiego jak var_dump (json_decode (json_encode ($ v))), aby pozbyć się obiektów – DarkSide

Odpowiedz

5

można napisać swoją własną

/** 
* Schows all visible Vars of a Object, only in the first Level. 
* To get private or protected we need to call the class 
* in the Context of the Object ($this) 
* @param object $obj The Object 
* @param string|null $newLineCharacter The New Line Character (If null, it is based on \n for CLI or <br/> on web 
* @return void 
*/ 
function firstLevelVarDump($obj, $newLineCharacter = null) { 
    //Decide which new Line Character we use (Based on Loïc suggestion) 
    if ($newLineCharacter === null) { 
     $newLineCharacter = php_sapi_name() == 'cli' ? PHP_EOL : '<br/>'; 
    } 
    //Get all visible Items 
    $data = get_object_vars($obj); 

    //Loop through each Item 
    foreach ($data as $key => $item) { 
     //Display Key + Type 
     echo $key . ' => ' . gettype($item); 

     //Extract Details, beased on the Type 
     if (is_string($item)) { 
      echo '(' . strlen($item) . ') "' . $item . '"'; 
     } elseif (is_bool($item)) { 
      echo '(' . ($item ? 'true' : 'false') . ')'; 
     } elseif (is_integer($item) || is_float($item)) { 
      echo '(' . $item . ')'; 
     } elseif (is_object($item)) { 
      echo '(' . get_class($item) . ')'; 
     } 

     //Line Break 
     echo $newLineCharacter; 
    } 
} 
+1

'echo" \ n "' działa dobrze na cli i unixie, ale nie dla sieci, zobacz moją odpowiedź poniżej, aby użyć czegoś bardziej odpowiedniego ('$ EOL = php_sapi_name() == 'cli'? PHP_EOL: '
';') –

+0

Dzięki za komentarz. To jest dobry punkt. Ale var_dump również używa '\ n'. W każdym razie aktualizuję moją odpowiedź. –

1

coś wzdłuż tych linii powinno załatwić sprawę:

<?php 

function object_dump($object, $show_methods = true){ 
    $EOL = php_sapi_name() == 'cli' ? PHP_EOL : '<br/>'; 
    $LS = php_sapi_name() == 'cli' ? '--------------------------'.PHP_EOL : '<hr/>'; 
    if(php_sapi_name() != 'cli'){echo "<pre>";} 

    echo "Dump of object of class : ".get_class($object).$EOL.$LS; 

    if($show_methods){ 
     echo "Methods :".$EOL; 
     var_dump(get_class_methods($object)); 
     echo $LS; 
    } 

    echo "Properties :" . $EOL; 

    foreach(get_object_vars($object) as $property => $value){ 
     if(gettype($value) == "object"){ 
      $value = "object of ".get_class($value); 
     } 
     echo "$property : (".gettype($value).") $value $EOL"; 
    } 

    if(php_sapi_name() != 'cli'){echo "</pre>";} 

} 


class Foo 
{ 
    public $var1; 
    public $var2; 

    function do_foo() 
    { 
     echo "Doing foo."; 
    } 

} 

object_dump(new Foo()); 

drukuje:

Dump of object of class : Foo 
Methods : 
array(1) { 
    [0]=> 
    string(6) "do_foo" 
} 
Properties : 
var1 : (NULL) 
var2 : (NULL) 
Powiązane problemy