为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
暮色呼如 2022-09-03 16:26:30
我为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那么,我们如何从数组或对象中获取受保护密钥的值呢?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

与私有属性一样,不能从对象的内部上下文外部访问受保护的属性。但是,受保护属性和私有属性的区别在于,扩展对象可以查看父级的受保护属性,但不能查看私有属性。


如果出于任何原因必须直接访问受保护的属性,请扩展目标对象并提供 getter 方法:


class MyExtendingClass extends WC_Product_Simple {

    public function getData() {

        return $this->data;

    }

}

话虽如此,该类应该已经扩展了一个公开方法的父对象。这可能就是你要找的。在这种情况下,只需改为执行以下命令:WC_Product_Simpleget_data()


$data = $package['contents']['abc123']['data']->get_data();


查看完整回答
反对 回复 2022-09-03
?
森林海

TA贡献2011条经验 获得超2个赞

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'];


查看完整回答
反对 回复 2022-09-03
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信