PHP — Попытка получить доступ к значению в объекте

#php #arrays #json

#php #массивы #json

Вопрос:

Это объект woocommerce, который называется $_product

Когда я var_dump это получаю:

 object(WC_Product_Variation)#4358 (13) {
  ["post_type":protected]=>
  string(17) "product_variation"
  ["parent_data":protected]=>
  array(16) {
    ["title"]=>
    string(7) "Antares"
    ["status"]=>
    string(7) "publish"
    ["sku"]=>
    string(0) ""
  

Когда echo $_product->post_type; я получаю product_variation , как и ожидалось, но я не могу получить доступ к значению статуса!

var_dump($_product->parent_data); мне ничего не дает (пустой)

Почему?

Ответ №1:

Вы не можете получить доступ protected к свойствам за пределами экземпляра объекта или его родительских экземпляров. См. Видимость свойств на php.net для получения дополнительной информации.

Итак, почему можно получить доступ к $post_type , даже если это protected ? Ну, кто-то был достаточно «умен», чтобы определить исключение из правила в этом волшебном методе получения — https://woocommerce.github.io/code-reference/files/woocommerce-includes-legacy-abstract-wc-legacy-product.html#source-view.68

Это плохая практика, и ее не следует использовать.

Вместо этого вы можете создать свой собственный класс, который расширяет WC_Product_Variation и определяет свои собственные общедоступные методы получения getPostType() и getParentData() . Только не забудьте создать экземпляр MyWC_Product_Variation вместо WC_Product_Variation , когда вы хотите использовать методы получения.

 class MyWC_Product_Variation extends WC_Product_Variation
{
    public function getPostType(): string
    {
        return $this->post_type;
    }

    public function getParentData(): array
    {
        return $this->parent_data;
    }
}