【问题标题】:Show all public attributes (name and value) of an object显示对象的所有公共属性(名称和值)
【发布时间】:2012-04-18 00:53:04
【问题描述】:

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

我明白了

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

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

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

【问题讨论】:

  • 私有属性会在您从私有 props 可见的范围内调用 get_class_vars 时显示。来自文档:Depending on the scope, get_class_vars() will only return the properties that can be accessed from the current scope.

标签: php class object attributes


【解决方案1】:

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

无论如何,一个好的解决方案是将检索属性值的代码移出类。

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

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

See it in action.

更新:由于您在 PHP

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

【讨论】:

  • 我想我可以使用dump() 方法,我可以将它作为公共函数放入每个类中。您使用匿名函数的方法似乎很有趣。如果我使用你的代码,我会在你的示例的第二行得到Parse error: syntax error, unexpected T_FUNCTION in
  • @testing:那是因为您使用的是 PHP
  • 你是对的。我正在使用 PHP 5.2.9。 PHP 5.2.9 不支持您的示例的哪一部分?还有其他方法可以重写您的示例吗?
  • @testing:上面的代码可以被描述为可爱或可怕,这取决于你问谁。考虑回避所有这些并创建一个普通的顶级函数。简单就是好。
【解决方案2】:

你可以通过php Reflection api轻松做到这一点

【讨论】:

  • 谷歌“php反射”并找到一些教程来学习。我可以向你保证这是一条正确的道路。学完 php 反射,你可以做更多的事情。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

      我完全认识到您要实现的目标,所以为什么不提供类似这样的外部帮助...(从 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";
      
      ?>
      

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

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

      【讨论】:

      • 我刚刚注意到这已被否决。 WTF,在每个类中编写相同的东西并不是一个好主意,尤其是对于匿名函数,如果有的话,应该谨慎使用它们,好的答案是有一个静态或单例的实用程序类,在你的开头引导程序(我的回答),或者使用 Jon 后来对 Jon 说的全局函数......因为它不会让我评论您的代码,如果您阅读此内容,请回复我很想知道您匿名背后的想法它及其对可维护性的影响
      猜你喜欢
      • 2016-09-18
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多