PHP-打印对象的所有属性


74

我在php页面中有一个未知对象。

如何打印/回显它,以便查看它具有哪些属性/值?

函数呢?有什么办法知道对象具有什么功能?


4
(@Brad洛瑞想与大家分享一些我从字面上复制他的文字,不以任何方式已经促成了其内容。):有的两个差异print_r()var_dump()var_dump()可以采用多个$expression参数(不算大)。但是,print_r()有一个可选参数$return,默认为FALSE,但可以设置为TRUE,这会使函数“返回”输出,而不仅仅是表达它。如果您要收集print_r()结果,然后在输出底部的开发人员“块”中表示结果,这将非常有用。
varocarbas

@varocarbas,“但是可以设置为TRUE” <-为此。
Coisox

@Coisox老实说,我什至不记得我写这篇文章的确切原因(我猜一个没有足够声誉的人试图通过发布新答案分享这些想法,我将其删除作为我的审核职责的一部分),但这是很明显,您应该感谢Brad Lowry而不是我。即使不记得那一刻的确切时刻,也无视我对真正作者的清晰提及,我可以告诉你我确实没有写过那部分文字。
varocarbas '18 -10-4

第二个可选参数的使用令人难以置信!对于网上商店中的$ product对象,我现在可以使用print_r($products,True)来代替通过get_object_vars($product)进行调试日志记录error_log(...,0)。并且另外获得对象变量的键值,在我的情况下,这些对象值被组织为一个关联数组。我想知道为什么print_r($ product)返回1作为结果。非常感谢Brad Lowry!
feli_x

使用print_r进行调试时的提示:始终将其与指定为true的第二个参数一起使用以禁止错误。例如error_log("print_r(\$product) = ".print_r($product),0);,在我的情况下,在连接器脚本中引起了错误,虽然error_log("print_r(\$product,true) = ".print_r($product,true),0);还可以。(并且还提供了所需的输出:-)
feli_x

Answers:


101
<?php var_dump(obj) ?>

要么

<?php print_r(obj) ?>

这些也是您用于数组的相同内容。

这些将显示使用PHP 5的对象的受保护和私有属性。根据手册,不会显示静态类成员。

如果您想了解成员方法,可以使用get_class_methods()

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

相关资料:

get_object_vars()

get_class_vars()

get_class() <-表示实例的名称


1
函数呢?有什么办法知道对象具有什么功能?
堆栈

我在上面的get_class_methods()中添加了。
彼得·阿杰泰

这显示了类数据,而不是特定的对象数据。
黑色

另外,您可以添加html <pre> </ pre>以获得更清晰的输出。
Marco Floriano

13

因为没有人没有提供过一种面向对象的方法,但是这里就像要做的那样。

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
        )

)

使用反射的好处是可以按属性的可见性进行过滤,如下所示:

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

由于Person :: $ property是私有的,因此在通过IS_PRIVATE过滤时返回:

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

)

阅读文档!




4

要获取更多信息,请使用以下自定义TO($ someObject)函数:

我写了这个简单的函数,它不仅显示给定对象的方法,还显示其属性,封装和一些其他有用的信息,例如发行说明(如果给出)。

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>";
            }

为了向您展示它的工作原理,我现在将创建一些随机的示例类。让我们创建一个名为Person的类,并在类声明的上方放置一些发行说明:

        /**
         * 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;
            }
        }

现在,让我们创建一个Person的实例,并用我们的函数包装它。

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

这将输出有关类名称,参数和方法的信息,包括封装信息和参数数量,每个方法的参数名称,方法位置以及它所在的代码行。请参见下面的输出:

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 ]

如果您不介意的话,您能帮我这个stackoverflow.com/questions/42321017 / ...吗?非常感谢您的帮助。
约瑟夫

2

了解对象属性var_dump(object)是最好的方法。它会显示与之关联的所有公共,私有和受保护的属性,而无需知道类名。

但是在方法的情况下,您需要知道类名,否则我认为很难获得对象的所有关联方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.