PHP - druckt alle Eigenschaften eines Objekts


74

Ich habe ein unbekanntes Objekt in der PHP-Seite.

Wie kann ich es drucken / wiedergeben, damit ich sehen kann, welche Eigenschaften / Werte es hat?

Was ist mit Funktionen? Gibt es eine Möglichkeit zu wissen, welche Funktionen ein Objekt hat?


3
(@Brad Lowry möchte etwas mit Ihnen teilen. Ich habe seinen Text buchstäblich kopiert, ohne in irgendeiner Weise zum Inhalt beigetragen zu haben.): Es gibt zwei Unterschiede zwischen print_r()und var_dump(). var_dump()kann mehrere $expressionParameter annehmen (kein Problem). Allerdings print_r()hat einen optionalen Parameter , $returnwelche standardmäßig auf FALSE, kann aber auf TRUE gesetzt werden , die die Funktion ‚Rückkehr‘ die aus eher setzen macht , als es einfach auszudrücken. Dies kann sehr nützlich sein, wenn Sie das print_r()Ergebnis sammeln und dann in einem Entwicklerblock am Ende Ihrer Ausgabe ausdrücken möchten .
Varocarbas

@varocarbas, "kann aber auf TRUE gesetzt werden" <- thx dafür.
Coisox

@Coisox Ehrlich gesagt erinnere ich mich nicht einmal an die genauen Gründe, warum ich das geschrieben habe (ich denke, dass jemand ohne ausreichenden Ruf versucht hat, diese Ideen durch das Posten einer neuen Antwort zu teilen, die ich im Rahmen meiner Moderationspflichten gelöscht habe), aber es ist so klar, dass Sie eher Brad Lowry als mir danken sollten. Selbst ohne mich an diesen genauen Moment zu erinnern und meinen klaren Hinweis auf den wirklichen Autor zu ignorieren, kann ich Ihnen sagen, dass ich keinen Teil dieses Textes sicher geschrieben habe.
Varocarbas

Die Verwendung des zweiten optionalen Arguments ist unglaublich! Für ein $ product-Objekt in einem Webshop kann ich jetzt print_r($products,True)anstelle der get_object_vars($product)Debug-Protokollierung über verwenden error_log(...,0). Und man erhält zusätzlich die Schlüsselwerte der Objektvariablen, die in meinem Fall als assoziatives Array organisiert sind. Ich habe mich gefragt, warum print_r ($ product) als Ergebnis 1 zurückgegeben hat. Vielen Dank an Brad Lowry!
feli_x

Ein Hinweis bei der Verwendung von print_r zum Debuggen: Verwenden Sie es immer mit dem zweiten Argument, das als true angegeben ist, um Fehler zu vermeiden. ZB error_log("print_r(\$product) = ".print_r($product),0);verursachte in meinem Fall einen Fehler in einem Connector-Skript, während error_log("print_r(\$product,true) = ".print_r($product,true),0);es in Ordnung war. (Und gab auch die gewünschte Ausgabe :-)
feli_x

Antworten:


100
<?php var_dump(obj) ?>

oder

<?php print_r(obj) ?>

Dies sind die gleichen Dinge, die Sie auch für Arrays verwenden.

Diese zeigen geschützte und private Eigenschaften von Objekten mit PHP 5. Statische Klassenmitglieder werden gemäß Handbuch nicht angezeigt.

Wenn Sie die Mitgliedsmethoden kennen möchten, können Sie get_class_methods () verwenden :

$class_methods = get_class_methods('myclass');
// or
$class_methods = get_class_methods(new myclass());
foreach ($class_methods as $method_name) 
{
    echo "$method_name<br/>";
}

Verwandte Sachen:

get_object_vars ()

get_class_vars ()

get_class () <- für den Namen der Instanz


1
Was ist mit Funktionen? Gibt es eine Möglichkeit zu wissen, welche Funktionen ein Objekt hat?
Stapler

Ich habe oben in get_class_methods () hinzugefügt.
Peter Ajtai

Dies zeigt die Klassendaten, nicht die spezifischen Objektdaten.
Schwarzer

Sie können auch das HTML <pre> </ pre> hinzufügen, um eine sauberere Ausgabe zu erhalten.
Marco Floriano

13

Da noch niemand einen OO-Ansatz angegeben hat, ist dies hier der Fall.

class Person {
    public $name = 'Alex Super Tramp';

    public $age = 100;

    private $property = 'property';
}


$r = new ReflectionClass(new Person);
print_r($r->getProperties());

//Outputs
Array
(
    [0] => ReflectionProperty Object
        (
            [name] => name
            [class] => Person
        )

    [1] => ReflectionProperty Object
        (
            [name] => age
            [class] => Person
        )

    [2] => ReflectionProperty Object
        (
            [name] => property
            [class] => Person
        )

)

Der Vorteil bei der Verwendung von Reflektion besteht darin, dass Sie nach der Sichtbarkeit der Eigenschaft wie folgt filtern können:

print_r($r->getProperties(ReflectionProperty::IS_PRIVATE));

Da die Person :: $ -Eigenschaft privat ist, wird sie beim Filtern nach IS_PRIVATE zurückgegeben:

//Outputs
Array
(
    [0] => ReflectionProperty Object
        (
            [name] => property
            [class] => Person
        )

)

Lesen Sie die Dokumente!




4

Um weitere Informationen zu erhalten, verwenden Sie diese benutzerdefinierte TO-Funktion ($ someObject):

Ich habe diese einfache Funktion geschrieben, die nicht nur die Methoden eines bestimmten Objekts anzeigt, sondern auch dessen Eigenschaften, Kapselung und einige andere nützliche Informationen wie Versionshinweise, falls angegeben.

function TO($object){ //Test Object
                if(!is_object($object)){
                    throw new Exception("This is not a Object"); 
                    return;
                }
                if(class_exists(get_class($object), true)) echo "<pre>CLASS NAME = ".get_class($object);
                $reflection = new ReflectionClass(get_class($object));
                echo "<br />";
                echo $reflection->getDocComment();

                echo "<br />";

                $metody = $reflection->getMethods();
                foreach($metody as $key => $value){
                    echo "<br />". $value;
                }

                echo "<br />";

                $vars = $reflection->getProperties();
                foreach($vars as $key => $value){
                    echo "<br />". $value;
                }
                echo "</pre>";
            }

Um Ihnen zu zeigen, wie es funktioniert, werde ich jetzt eine zufällige Beispielklasse erstellen. Erstellen Sie eine Klasse namens Person und platzieren Sie einige Versionshinweise direkt über der Klassendeklaration:

        /**
         * DocNotes -  This is description of this class if given else it will display false
         */
        class Person{
            private $name;
            private $dob;
            private $height;
            private $weight;
            private static $num;

            function __construct($dbo, $height, $weight, $name) {
                $this->dob = $dbo;
                $this->height = (integer)$height;
                $this->weight = (integer)$weight;
                $this->name = $name;
                self::$num++;

            }
            public function eat($var="", $sar=""){
                echo $var;
            }
            public function potrzeba($var =""){
                return $var;
            }
        }

Jetzt erstellen wir eine Instanz einer Person und schließen sie mit unserer Funktion ein.

    $Wictor = new Person("27.04.1987", 170, 70, "Wictor");
    TO($Wictor);

Dadurch werden Informationen zum Klassennamen, zu Parametern und Methoden ausgegeben, einschließlich Kapselungsinformationen und Anzahl der Parameter, Namen der Parameter für jede Methode, Methodenposition und Codezeilen, in denen sie vorhanden sind. Siehe die Ausgabe unten:

CLASS NAME = Person
/**
             * DocNotes -  This is description of this class if given else it will display false
             */

Method [  public method __construct ] {
  @@ C:\xampp\htdocs\www\kurs_php_zaawansowany\index.php 75 - 82

  - Parameters [4] {
    Parameter #0 [  $dbo ]
    Parameter #1 [  $height ]
    Parameter #2 [  $weight ]
    Parameter #3 [  $name ]
  }
}

Method [  public method eat ] {
  @@ C:\xampp\htdocs\www\kurs_php_zaawansowany\index.php 83 - 85

  - Parameters [2] {
    Parameter #0 [  $var = '' ]
    Parameter #1 [  $sar = '' ]
  }
}

Method [  public method potrzeba ] {
  @@ C:\xampp\htdocs\www\kurs_php_zaawansowany\index.php 86 - 88

  - Parameters [1] {
    Parameter #0 [  $var = '' ]
  }
}


Property [  private $name ]

Property [  private $dob ]

Property [  private $height ]

Property [  private $weight ]

Property [ private static $num ]

Würden Sie mir bei diesem stackoverflow.com/questions/42321017/… helfen, wenn Sie nichts dagegen haben ? Ich freue mich über Ihre Hilfe.
Joseph

2

Um die Objekteigenschaften zu kennen, ist var_dump (Objekt) der beste Weg. Es werden alle damit verbundenen öffentlichen, privaten und geschützten Eigenschaften angezeigt, ohne den Klassennamen zu kennen.

Aber im Falle von Methoden müssen Sie den Klassennamen kennen, sonst denke ich, dass es schwierig ist, alle zugehörigen Methoden des Objekts zu erhalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.