如何将类的所有公共属性作为json?

min*_*004 3 php arrays oop json function

考虑以下示例:

<?php

class p{
    public $name = 'jimmy';
    public $sex = 'male';
    private $age = 31;
    // there should be more unknow properties here ..

    function test(){
        echo $this->name;
    }

    function get_p_as_json(){
        // how can i get json of this class which contains only public properties ?
        // {"name":"jimmy","sex":"male"}
    }

}

$p = new p();
$json = $p->get_p_as_json();
echo $json;
Run Code Online (Sandbox Code Playgroud)

问题: 如何获取班级的所有公共属性JSON

She*_*ose 6

你刚才创建另一个类q的扩展p.然后代码如下所示:

class p{
    public $name = 'jimmy';
    public $sex = 'male';
    private $age = 31;
    // there should be more unknow properties here ..

    function test(){
        echo $this->name;
    }
}

class q extends p{
    function get_p_as_json($p){
        return json_encode(get_object_vars($p));
    }
}
$q  =   new q();
$p  =   new p();
$json   =   $q->get_p_as_json($p);
echo $json;
Run Code Online (Sandbox Code Playgroud)


Sha*_*ran 5

由于public成员也可以在课外访问..

访问课外的成员

$p = new p();
foreach($p as $key => $value) {
    $arr[$key]=$value;
}
Run Code Online (Sandbox Code Playgroud)

Demo

public通过利用来访问班级内的成员ReflectionClass

<?php

class p{
    public $name = 'jimmy';
    public $sex = 'male';
    private $age = 31;



    // there should be more unknow properties here ..

    function test(){
        echo $this->name;
    }

    function get_p_as_json(){
        static $arr;
        $reflect = new ReflectionClass(p);
        $props   = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);

        foreach ($props as $prop) {
            $arr[$prop->getName()]=$prop->getValue($this); //<--- Pass $this here
        }
        return json_encode($arr);

    }
}

$p = new p();
echo $json=$p->get_p_as_json();
Run Code Online (Sandbox Code Playgroud)

Demo


koa*_*der 5

$a = array();
$reflect = new ReflectionClass($this /* $foo */);
$props   = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);

foreach ($props as $prop) {
    /* here you can filter for spec properties or you can do some recursion */
    $a[ $prop->getName() ] = $a[ $prop->getValue()]; 
}

return json_encode($a);
Run Code Online (Sandbox Code Playgroud)