【问题标题】:How to convert (cast) Object to Array without Class Name prefix in PHP?如何在 PHP 中将(转换)对象转换为没有类名前缀的数组?
【发布时间】:2012-08-07 14:05:26
【问题描述】:

如何在 PHP 中将对象转换(转换)为没有类名前缀的数组?

class Teste{

    private $a;
    private $b;

    function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

}

var_dump((array)(new Teste('foo','bar')));

结果:

array
  '�Teste�a' => string 'foo' (length=3)
  '�Teste�b' => string 'bar' (length=3)

预期:

array (
a => 'foo'
b => 'bar' )

【问题讨论】:

    标签: php arrays object


    【解决方案1】:

    来自manual

    如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名称,有一些值得注意的例外:整数属性不可访问; 私有变量在变量名前加上类名;受保护的变量在变量名前有一个“*”。 这些前置值在两边都有空字节。这可能会导致一些意外行为:

    因此,您可以像这样解决这个问题:

    $temp = (array)(new Teste('foo','bar'));
    $array = array();
    foreach ($temp as $k => $v) {
      $k = preg_match('/^\x00(?:.*?)\x00(.+)/', $k, $matches) ? $matches[1] : $k;
      $array[$k] = $v;
    }
    var_dump($array);
    

    没有办法控制/禁用这种行为似乎很奇怪,因为没有碰撞风险。

    【讨论】:

    • 谢谢...你救了我的命 :) 我不知道为什么,反射类对我不起作用,删除 'x00*' 字符使我可以通过转换访问对象到数组
    【解决方案2】:

    “类名前缀”是属性(内部)名称的一部分。因为您将两者都声明为 private,所以 PHP 需要一些东西来将其与任何子类的属性 $a$b 区分开来。

    绕过它的最简单方法:不要让他们private。您可以将它们声明为 protected

    但是,这并不是在所有情况下都是解决方案,因为通常有人会故意将某事声明为 private。我建议实施一种方法,为您进行转换。这使您可以更好地控制结果数组的外观

    public function toArray() {
      return array(
        'a' => $this->a,
        'b' => $this->b
      );
    }
    

    【讨论】:

      【解决方案3】:

      据我所知,PHP 没有简单的方法来做你想做的事。大多数语言都没有。你应该考虑反思。看看这个文档:http://www.php.net/manual/en/reflectionclass.getproperties.php

      我已经创建了一个可以按预期工作的函数:

      function objectToArr($obj)
      {
          $result = array();
          ReflectionClass $cls = new ReflectionClass($obj);
          $props = $cls->getProperties();
          foreach ($props as $prop)
          {
              $result[$prop->getName()] = $prop->getValue($obj);
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用反射来解决此任务。但像往常一样,这是一个强有力的指标,表明你的班级设计有些破损。然而:

        function objectToArray($obj) {
            // Create a reflection object
            $refl = new ReflectionClass($obj);
        
            // Retrieve the properties and strip the ReflectionProperty objects down
            // to their values, accessing even private members.
            return array_map(function($prop) use ($obj) {
                $prop->setAccessible(true);
                return $prop->getValue($obj);
            }, $refl->getProperties());
        }
        
        // Usage:
        $arr = objectToArray( new Foo() );
        

        【讨论】:

          猜你喜欢
          • 2022-01-14
          • 2012-01-11
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 2015-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多