显示对象的所有公共属性(名称和值)

时间:2012-04-04 10:06:09

标签: php class object attributes

This thread没有帮助我。

如果我使用

$class_vars = get_class_vars(get_class($this));

foreach ($class_vars as $name => $value) {
    echo "$name : $value\n";
}

我得到了

attrib1_name:attrib2_name:attrib3_name

没有价值观。此外,还显示了一个私有属性,我不想这样做。

如果我使用

echo "<pre>";
print_r(get_object_vars($this));
echo "</pre>";

我得到了

阵 (     [atrrib1_name] =&gt; attrib1_value     [attrib2_name] =&gt; attrib2_value )

这里我再次拥有私有属性和所有子属性。但这次我有价值观。如何将此约束到一个级别?

是否有可能用对象的值显示所有公共属性?

5 个答案:

答案 0 :(得分:5)

您看到非公开属性,因为get_class_vars根据当前范围工作。由于您使用$this,因此您的代码类中,因此非公共属性 可从当前范围访问。同样适用于get_object_vars,这可能是更好的选择。

在任何情况下,一个好的解决方案是将检索属性值的代码移出类。

如果您不想为此创建免费功能(为什么?认真,重新考虑!),您可以使用涉及匿名功能的技巧:

$getter = function($obj) { return get_object_vars($obj); };
$class_vars = $getter($this);

<强> See it in action

更新:因为您使用的是PHP&lt; 5.3.0,您可以使用此等效代码:

$getter = create_function('$obj', 'return get_object_vars($obj);');
$class_vars = $getter($this);

答案 1 :(得分:1)

您可以使用php Reflection api

轻松完成此操作

答案 2 :(得分:0)

扩展Mr.Coder's answer,这里是一个片段,用于获取对象的公共属性(名称和值)作为数组

public function getPublicProperties()
{
    $results = [];

    $reflectionObject = (new ReflectionObject($this));
    $properties = $reflectionObject->getProperties(ReflectionProperty::IS_PUBLIC);

    foreach ($properties as $property) {
        $results[$property->getName()] = $property->getValue($this);
    }

    return $results;
}

答案 3 :(得分:-1)

答案 4 :(得分:-1)

我完全认识到你想要达到的目标,所以为什么不用这样的东西来帮助...(从PHPFiddle粘贴)

<?php

final class utils {
    public static function getProperties(& $what) {
        return get_object_vars($what);
    }
}
class ball {
    var $name;
    private $x, $y;

    function __construct($name,$x,$y) {

    }

    function publicPropsToArray() {
        return utils::getProperties($this);
    }
    function allPropsToArray() {
        return get_object_vars($this);
    }
}

$ball1 = new ball('henry',5,6);
//$ball2 = new ball('henry',3,4);

echo "<pre>";
print_r($ball1->publicPropsToArray());
echo "\r\n\r\n";
print_r($ball1->allPropsToArray());

echo "\r\n\r\n";

?>

这样我既可以访问对象的所有属性,也可以访问诸如数据库访问层之类的内容,或类似地将“安全”数据发送到视图或其他非特权模型的函数,我只能发送公共属性,但在对象中定义了行为。

当然这会导致与实用类相结合,但公平地说并非所有耦合都是坏的,有些是实现最终目标的必要条件,不要被这些东西拖累