请考虑以下示例:
<?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;
问题: 如何将类的所有公开属性设为JSON
?
答案 0 :(得分: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;
答案 1 :(得分:5)
由于public
成员也可以在课外访问..
$p = new p();
foreach($p as $key => $value) {
$arr[$key]=$value;
}
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();
答案 2 :(得分: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);
答案 3 :(得分:3)
执行此操作的最佳方法不是调用类的方法本身。 但是,您可以启动以下内容:
$myPublicMethodsInJson = json_encode(get_class_methods($p));
但是,您无法从类中调用get_class_methods,因为它将返回您的所有方法,私有和公共方法。当你从课外调用它时,它只会返回公共方法。