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


Show all public attributes (name and value) of an object

这个线程对我没有帮助。

如果我使用

$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]=>属性1_value[attrib2_name]=>attrib2_value)

这里我又有一个私有属性和所有子属性。但这一次我有了价值观。如何将其限制在一个级别?

难道不存在用对象的值来显示所有公共属性的可能性吗?

您看到的是非公共属性,因为get_class_vars根据当前范围工作。由于您使用的是$this,您的代码在类内,因此非公共属性可以从当前作用域访问。get_object_vars也是如此,这可能是一个更好的选择。

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

如果你不想为此创建一个免费函数(为什么?说真的,重新考虑!),你可以使用一个涉及匿名函数的技巧:

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

在实际操作中查看

更新:由于您使用的是PHP<5.3.0,您可以使用此等效代码:

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

您可以使用php反射api 轻松完成此操作

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

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

使用get_object_vars。请参阅:http://dk.php.net/manual/en/function.get-object-vars.php

我完全认识到你正在努力实现的目标,所以为什么不有这样的外部帮助呢。。。(粘贴自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";
?>

通过这种方式,我既可以访问对象的所有属性,也可以访问数据库访问层之类的东西,或者类似地,对于向视图或其他非特权模型发送"安全"数据的函数,我可以只发送公共属性,但在对象内定义行为。

当然,这会导致与实用程序类的耦合,但公平地说,并不是所有的耦合都是坏的,有些耦合很难实现最终目标,不要被这些事情所困扰