2012-04-04 107 views
3

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] => attrib1_value [attrib2_name] => attrib2_value )

在这里,我再次有一个私人属性和所有的子属性。但是这次我有价值。我怎样才能将它限制在一个层面上?

难道没有表现出与他们的对象的值,所有的公共属性的可能性?

+1

私人性质显示为你陷入下跌从私有道具可见的范围调用get_class_vars。从文档:'根据范围,get_class_vars()将只返回可以从当前范围访问的属性。“#: – 2012-04-04 10:13:44

回答

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 5.3.0 <,您可以使用此等效代码:

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

我以为我可以使用'dump()'方法,我可以把每个类作为一个公共函数。用匿名函数的方法看起来很有趣。如果我使用你的代码,我会在你的例子的第二行中得到'Parse error:syntax error,unexpected T_FUNCTION'。 – testing 2012-04-04 10:24:03

+1

@testing:这是因为您正在使用PHP <5.3.0。查看我的更新。 – Jon 2012-04-04 10:25:33

+0

你说得对。我使用PHP 5.2.9。您的示例的哪部分不受PHP 5.2.9支持?有没有另一种方法来重写你的例子? – testing 2012-04-04 10:30:01

1
+0

php.net似乎今天几乎不可能... – testing 2012-04-04 10:17:17

+0

谷歌”PHP反射“,并找到一些教程学习。我可以向你保证它是一条正确的道路。学习php反射后,你可以做更多。 – 2012-04-04 10:20:53

+1

@testing你可以访问特定的国家,如http://ca.php.net/ – 2012-04-04 10:21:23

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

?> 

这样我既可以访问该送的对象或东西的所有属性,如数据库访问层或类似的功能“安全”数据T Ø视图或其它非特权模式,我可以只发送的公共属性,但有对象中定义的行为。

当然这会导致与公用事业类耦合,但要公平并非所有的接头是坏的,有些是nesecarry实现的最终目标,不要被这些东西

+0

我只是注意到,这已被低估。 WTF在每个类中写同样的东西并不是一个好主意,尤其是对于匿名函数,它们应该尽量少用,好的答案是有一个静态或单例的实用程序类,在开始时引导程序(我的答案),或使用全球功能,因为乔恩后来说...对乔恩,因为它不会让我评论你的代码,如果你阅读这个请回应我想知道你背后的匿名背后的想法特别是它对可维护性的影响 – 2014-03-25 09:36:43