PHP доступ к защищенному ключу в объекте возвращает пустой - PullRequest
1 голос
/ 03 февраля 2020

Я пишу плагин доставки для WooCommerce, и когда я пытаюсь получить значения защищенного ключа ([key: protected]), он возвращается пустым. Как мы можем получить значение защищенного ключа из массива или объекта?

В частности, в функции calc_shipping woocommerce_shipping_init он передается в $ 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
                                )
                        )
                )
        )
)

Так что проблема в том, что когда я пытаюсь получить [имя] или [слаг], я получаю пустое значение для [данные : protected] объект (и, следовательно, [name] и [slug] не существуют). Например:

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

Итак, как мы можем получить значение защищенного ключа из массива или объекта?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Защищенные свойства не могут быть доступны извне внутреннего контекста объекта, так же как и частные свойства. Однако различие между защищенными и частными свойствами заключается в том, что расширяющийся объект может просматривать защищенные свойства родителя, но не частные свойства.

Если вам по какой-либо причине необходимо получить доступ к защищенным свойствам напрямую затем расширьте целевой объект и предоставьте метод получения:

class MyExtendingClass extends WC_Product_Simple {
    public function getData() {
        return $this->data;
    }
}

С учетом сказанного класс WC_Product_Simple должен уже расширять родительский объект, который предоставляет метод get_data(). Это может быть то, что вы ищете. В этом случае просто выполните следующее:

$data = $package['contents']['abc123']['data']->get_data();
0 голосов
/ 03 февраля 2020

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'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...