var_dump(),不显示受保护的私有属性


var_dump() without show protected and private property

是否有任何函数或如何在不显示受保护和私有属性的情况下var_dump()对象?

示例:

class foo {
    public $public = 'public';
    protected $protected = 'protected';
    private $private = 'private';
}
$Foo = new foo;
var_dump($Foo);
// Expected output "(string) public"

json_encode将只对公共属性进行编码。

如本页所示,您可以在对象上循环:

<?php
    class person {
        public $FirstName = "Bill";
        public $MiddleName = "Terence";
        public $LastName = "Murphy";
        private $Password = "Poppy";
        public $Age = 29;
        public $HomeTown = "Edinburgh";
        public $FavouriteColour = "Purple";
    }
    $bill = new person();
    foreach($bill as $var => $value) {
        echo "$var is $value'n";
    }
?>

请注意,$Password变量不在视线范围内,因为它被标记为Private,我们正试图从全局范围访问它。

如果你想制作自己的var转储,你可以这样做:

function dumpObj( $obj )
{
    foreach( $obj as $k=>$v )
    {
        echo $k . ' : ' . $v ."'n";
    }
}
dumpObj( new WhateverClass() );

这样做的原因是,当您访问对象外部的对象时,您只能访问其面向公共的成员变量。

json_decode(json_encode($obj))怎么样?

一个选项是在类中使用__clone方法。在那里,您可以从对象实例的克隆中取消设置任何不需要的属性,例如:
public function __clone() {
    unset( $this->my_secret_property ); 
}

那么var_dump将引用克隆:

var_dump( clone My_Object_Instance );

或者,如果您需要在其他地方进行克隆,您的类可以使用__debugInfo()方法来完全控制其var_dump输出,例如在取消设置任何不需要的数组元素后返回get_object_vars($this)。