3

这个线程没有帮助我。

如果我使用

$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>";

我明白了

数组( [attrib1_name] => attrib1_value [attrib2_name] => attrib2_value )

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

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

4

5 回答 5

5

您看到的是非公共属性,因为根据当前范围get_class_vars工作。由于您使用的代码位于类内部,因此可以从当前范围访问公共属性。这同样适用于这可能是一个更好的选择。$thisget_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);
于 2012-04-04T10:12:37.523 回答
2

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

于 2012-04-04T10:10:05.863 回答
0

扩展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;
}
于 2021-04-26T12:57:16.823 回答
-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";

?>

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

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

于 2013-09-20T15:45:54.333 回答
-1

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

于 2012-04-04T10:10:50.940 回答