PHP 访问对象中的受保护密钥返回空

我为WooCommerce编写了一个运输插件,当我尝试获取受保护密钥([key:protected])的值时,它会返回空的。我们如何从数组或对象中获取受保护密钥的值?


具体来说,在woocommerce_shipping_init的calculate_shipping函数中,它传递$package,这是一个数组,其中还包含一些对象,并且某些对象键受到保护。所以$package看起来像这样(这是一个简化版本):


Array

(

    [contents] => Array

        (

            [abc123] => Array

                (

                    [quantity] => 1

                    [data] => WC_Product_Simple Object

                        (

                            [object_type:protected] => product

                            [data:protected] => Array

                                (

                                    [name] => Carnal Seed CD and Study Guide - Oil Merchant Series

                                    [slug] => carnal-seed-cd-and-study-guide-oil-merchant-series

                                )

                        )

                )

        )

)

因此,当我尝试获取 [name] 或 [slug] 时,我得到 [data:protected] 对象的空值(因此 [name] 和 [slug] 不存在)。例如:


$data = $package['contents']['abc123']['data']->data; // $data returns empty

那么,我们如何从数组或对象中获取受保护密钥的值呢?


暮色呼如
浏览 108回答 2
2回答

梦里花落0921

与私有属性一样,不能从对象的内部上下文外部访问受保护的属性。但是,受保护属性和私有属性的区别在于,扩展对象可以查看父级的受保护属性,但不能查看私有属性。如果出于任何原因必须直接访问受保护的属性,请扩展目标对象并提供 getter 方法:class MyExtendingClass extends WC_Product_Simple {    public function getData() {        return $this->data;    }}话虽如此,该类应该已经扩展了一个公开方法的父对象。这可能就是你要找的。在这种情况下,只需改为执行以下命令:WC_Product_Simpleget_data()$data = $package['contents']['abc123']['data']->get_data();

森林海

B.弗莱明有比这更好的答案,但我仍然想分享我在看到他的回应之前所想到的。首先,我将对象转换为数组。这从对象中获取,并使其成为受保护的阵列密钥,如下所示。[key:protected][ * key]然后可以像这样访问受保护的数组密钥(必须使用双引号,因为它不适用于单引号)。$my_array["\0*\0key"]所以我的解决方案是这样的:$data_array = (array)$package['contents']['abc123']['data']; // Cast object to array$name = $data_array["\0*\0data"]['name'];
打开App,查看更多内容
随时随地看视频慕课网APP