【问题标题】:php automatic object to array conversionphp自动对象到数组的转换
【发布时间】:2016-05-20 09:37:53
【问题描述】:

我想将我的类对象转换为数组。我已经问过一个关于如何将对象转换为数组的问题。

Object to Array Conversion

但是在这样做的时候,我想知道我们是否可以这样做:

$arrObj = (数组) $objectOfMyClass;

据我所知,它会将对象转换为数组,但如果有一些用户定义的函数,我可以在其中控制此行为并允许少数成员作为数组键传递。

例如,假设我有一堂课:

class Property {
    private $x;
    protected $y;
    public $z;

    public function someFunction() {
        //some code
    }

    public function someFunction1() {
        //some code1
    }
}

$objArray = (array) (new Property());

echo '<pre>', print_r($objArray, true), '</pre>';

输出:

Array
(
    [Propertyx] => 
    [*y] => 
    [z] => 
)

但我不想要这个输出我想改变这个输出并想要这样的输出:

Array
(
    [z] => 
)

Array
(
    [y] => 
    [z] => 
)

所以当有人试图像这样type cast我的类对象时,我必须有某种方法可以调用用户定义的函数:

class Property {
    ....
    ....

    public function __toArray() {
        return <'only public or protected members'>
    }
}

当有人使用以下语句时:

$objArray = (array) (new Property());

它应该调用__toArray 方法。和__toString一样。

如果有人知道任何方法可以做这样的事情,请帮助我。

如果有任何其他可能导致相同输出的解决方案将非常有帮助。

提前致谢。

【问题讨论】:

    标签: php arrays oop casting magic-methods


    【解决方案1】:

    不幸的是,对于数组转换,没有与 __toString 等效的魔法。多年来已经有一些添加它的提议,以及类似的__toBool__toFloat 方法,但都没有取得太大进展(例如https://wiki.php.net/rfc/object_cast_to_types

    对象支持实现ArrayAccess 接口,该接口以其他方式将它们视为数组,但它不提供完整转换的方法。

    有几种解决方法:

    get_object_vars

    如前所述,公共属性只能使用get_object_vars 方法进行转换,例如

    class Foo
    {
        private $x = 1;
        protected $y = 2;
        public $z = 3;
    }
    
    print_r(get_object_vars(new Foo));
    
    Array
    (
        [z] => 3
    )
    

    JsonSerializable

    JsonSerializable 接口允许您将自定义逻辑应用于调用 json_encode 时发生的事情,这提供了一种改进,它允许您包含私有或受保护的属性,或您拥有的任何其他自定义逻辑。

    class Foo implements JsonSerializable
    {
        private $x = 1;
        protected $y = 2;
        public $z = 3;
    
        public function jsonSerialize()
        {
            return get_object_vars($this);
        }
    }
    
    print_r(json_decode(json_encode(new Foo), true));
    
    Array
    (
        [x] => 1
        [y] => 2
        [z] => 3
    )
    

    上面的json_decodejson_encode调用当然可以用一些简单的语法糖包裹起来,比如

    function toArray($obj)
    {
        return json_decode(json_encode($obj), true);
    }
    
    print_r(toArray(new Foo));
    

    但是,这些都不允许您覆盖使用数组转换本身时发生的情况。希望有一天其中一个提案会被接受,但在那之前,这些都是最好的选择。

    【讨论】:

      【解决方案2】:

      使用json_decode()json_encode()将php对象转换为数组..

      $obj = (object) array('1' => 'foo');
      echo "<pre>"; print_r($obj);
      

      您的$obj 如下所示:

      stdClass Object
      (
          [1] => foo
      )
      

      现在使用这个:

      $array = json_decode(json_encode($obj),true);
      echo "<pre>"; print_r($array);
      

      这会给你数组

      Array
      (
          [1] => foo
      )
      

      【讨论】:

      • 我不想将对象转换为数组,我想像 __toString 魔术方法将对象转换为字符串一样自动完成。
      • 对不起兄弟,我不知道任何其他方法@AshishAwasthi,但如果我对你有帮助,我会告诉你,,,
      • 另一种方法是get_object_vars,我认为没有其他方法可以做到这一点......
      • 我认为你应该在回答之前先阅读我的问题,并且应该访问我在我的问题中提到的链接,这样的答案在我们谷歌时已经可用,我也询问了如何从对象转换在我提到的链接问题中排列。
      猜你喜欢
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2022-01-14
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多