使用PHP,如何访问Stripe API返回的protected_values属性


Using PHP, how can I access the protected _values property returned from the Stripe API?

我正在将Stripe API与CMS集成。我需要将查询中的_values属性作为数组返回,以便数据在CMS中作为模板变量可用,但它始终受到保护。

我一直在使用Reflection类来获取数据,但现在我使用的是Stripe的'Stripe'Plan::all();,我必须多次调用我为处理Reflection类别而编写的快捷方式方法。不过,它并不完全是递归的,因为我必须根据从Stripe API调用的方法来不同地处理它。

有没有一种方法可以真正递归地使用反射类?还有什么比我不知道的Reflection类更合适的吗?


以下是'Stripe'Plan::all();:的var_dump() ed响应示例

object(Stripe'Collection)#604 (5) {
  ["_opts":protected]=>
  object(Stripe'Util'RequestOptions)#603 (2) {
    ["headers"]=>
    array(0) {
    }
    ["apiKey"]=>
    string(32) "XXXXXXXXXXXXXXXX"
  }
  ["_values":protected]=>
  array(4) {
    ["object"]=>
    string(4) "list"
    ["has_more"]=>
    bool(false)
    ["url"]=>
    string(9) "/v1/plans"
    ["data"]=>
    array(2) {
      [0]=>
      object(Stripe'Plan)#605 (5) {
        ["_opts":protected]=>
        object(Stripe'Util'RequestOptions)#603 (2) {
          ["headers"]=>
          array(0) {
          }
          ["apiKey"]=>
          string(32) "XXXXXXXXXXXXXXXX"
        }
        ["_values":protected]=>
        array(12) {
          ["id"]=>
          string(8) "my_plan"
          ["interval"]=>
          string(5) "month"
          ["name"]=>
          string(9) "My Plan"
          ["created"]=>
          int(1427441577)
          ["amount"]=>
          int(20000)
          ["currency"]=>
          string(3) "usd"
          ["object"]=>
          string(4) "plan"
          ["livemode"]=>
          bool(false)
          ["interval_count"]=>
          int(1)
          ["trial_period_days"]=>
          NULL
          ["metadata"]=>
          object(Stripe'AttachedObject)#608 (5) {
            ["_opts":protected]=>
            object(Stripe'Util'RequestOptions)#603 (2) {
              ["headers"]=>
              array(0) {
              }
              ["apiKey"]=>
              string(32) "XXXXXXXXXXXXXXXX"
            }
            ["_values":protected]=>
            array(0) {
            }
            ["_unsavedValues":protected]=>
            object(Stripe'Util'Set)#612 (1) {
              ["_elts":"Stripe'Util'Set":private]=>
              array(0) {
              }
            }
            ["_transientValues":protected]=>
            object(Stripe'Util'Set)#613 (1) {
              ["_elts":"Stripe'Util'Set":private]=>
              array(0) {
              }
            }
            ["_retrieveOptions":protected]=>
            array(0) {
            }
          }
          ["statement_descriptor"]=>
          NULL
        }
        ["_unsavedValues":protected]=>
        object(Stripe'Util'Set)#609 (1) {
          ["_elts":"Stripe'Util'Set":private]=>
          array(0) {
          }
        }
        ["_transientValues":protected]=>
        object(Stripe'Util'Set)#610 (1) {
          ["_elts":"Stripe'Util'Set":private]=>
          array(0) {
          }
        }
        ["_retrieveOptions":protected]=>
        array(0) {
        }
      }
      [1]=>
      object(Stripe'Plan)#611 (5) {
        ["_opts":protected]=>
        object(Stripe'Util'RequestOptions)#603 (2) {
          ["headers"]=>
          array(0) {
          }
          ["apiKey"]=>
          string(32) "XXXXXXXXXXXXXXXX"
        }
        ["_values":protected]=>
        array(12) {
          ["id"]=>
          string(9) "some_other_plan"
          ["interval"]=>
          string(5) "month"
          ["name"]=>
          string(14) "Some Other Plan"
          ["created"]=>
          int(1427431129)
          ["amount"]=>
          int(40000)
          ["currency"]=>
          string(3) "usd"
          ["object"]=>
          string(4) "plan"
          ["livemode"]=>
          bool(false)
          ["interval_count"]=>
          int(1)
          ["trial_period_days"]=>
          NULL
          ["metadata"]=>
          object(Stripe'AttachedObject)#614 (5) {
            ["_opts":protected]=>
            object(Stripe'Util'RequestOptions)#603 (2) {
              ["headers"]=>
              array(0) {
              }
              ["apiKey"]=>
              string(32) "XXXXXXXXXXXXXXXX"
            }
            ["_values":protected]=>
            array(0) {
            }
            ["_unsavedValues":protected]=>
            object(Stripe'Util'Set)#618 (1) {
              ["_elts":"Stripe'Util'Set":private]=>
              array(0) {
              }
            }
            ["_transientValues":protected]=>
            object(Stripe'Util'Set)#619 (1) {
              ["_elts":"Stripe'Util'Set":private]=>
              array(0) {
              }
            }
            ["_retrieveOptions":protected]=>
            array(0) {
            }
          }
          ["statement_descriptor"]=>
          NULL
        }
        ["_unsavedValues":protected]=>
        object(Stripe'Util'Set)#615 (1) {
          ["_elts":"Stripe'Util'Set":private]=>
          array(0) {
          }
        }
        ["_transientValues":protected]=>
        object(Stripe'Util'Set)#616 (1) {
          ["_elts":"Stripe'Util'Set":private]=>
          array(0) {
          }
        }
        ["_retrieveOptions":protected]=>
        array(0) {
        }
      }
    }
  }
  ["_unsavedValues":protected]=>
  object(Stripe'Util'Set)#606 (1) {
    ["_elts":"Stripe'Util'Set":private]=>
    array(0) {
    }
  }
  ["_transientValues":protected]=>
  object(Stripe'Util'Set)#607 (1) {
    ["_elts":"Stripe'Util'Set":private]=>
    array(0) {
    }
  }
  ["_retrieveOptions":protected]=>
  array(0) {
  }
}

您不必使用Reflection API,Stripe'Collection类实现了ArrayAccess,您可以直接迭代它:

$collection = 'Stripe'Plan::all();
foreach ($collection as $plan) {
    // Do something with the plan
}

这是Collection类扩展的基类。Stripe的PHP库中几乎所有的类都是如此,包括Stripe'Plan。因此,您可以使用普通数组中使用的任何类型的递归。

如果要将_values属性作为数组返回,可以使用__toArray()方法:

$array = $collection->__toArray(true);

true参数是一个递归选项。

要添加到Victor Stanciu的答案中,如果您只想访问_values数组的某些元素,则可以使用动态属性。

例如,如果你想访问数据,你可以这样做:

$collection = 'Stripe'Plan::all();
$plans = $collection->data;

然后,类似地,您可以从每个计划中检索任何数组元素:

foreach ($plans as $plan) {
    print $plan->name;
}

我将此代码用于Stripe API版本3。