3

我有一个对象被扔到会话数组中,我想在 items 属性上运行一个 foreach。

我似乎无法访问它。我看到它是私有的,但我不禁想知道为什么 var_dump 可以向我显示属性包含的内容但我无法读取数据,因为它会引发致命错误?

如果我真的必须喜欢这个,我想我可以做一些输出缓冲并将 var_dump 评估为字符串,但似乎应该有更好的方法。有什么想法可以访问_items吗?

目标代码 var_dumped 来自var_dump($_SESSION['PHPurchaseCart'])

object(PHPurchaseCart)#191 (4) {
  ["_items:private"]=>
  array(2) {
    [0]=>
    object(PHPurchaseCartItem)#190 (6) {
      ["_productId:private"]=>
      string(2) "80"
      ["_quantity:private"]=>
      int(1)
      ["_optionInfo:private"]=>
      string(20) "Monthly Sponsorship "
      ["_priceDifference:private"]=>
      string(3) ".01"
      ["_customFieldInfo:private"]=>
      NULL
      ["_formEntryIds:private"]=>
      array(0) {
      }
    }
    [1]=>
    object(PHPurchaseCartItem)#189 (6) {
      ["_productId:private"]=>
      string(2) "75"
      ["_quantity:private"]=>
      int(1)
      ["_optionInfo:private"]=>
      string(20) "Monthly Sponsorship "
      ["_priceDifference:private"]=>
      string(3) ".02"
      ["_customFieldInfo:private"]=>
      NULL
      ["_formEntryIds:private"]=>
      array(0) {
      }
    }
  }
  ["_promotion:private"]=>
  NULL
  ["_promoStatus:private"]=>
  int(0)
  ["_shippingMethodId:private"]=>
  NULL
}

我尝试访问它的方式:

$fun = $_SESSION['PHPurchaseCart'];
var_dump($fun->_items);
exit;

上面抛出了一个致命错误。

4

3 回答 3

6

这就是私有属性的想法:你不能访问它们。你真的不应该打破这个概念。如果您真的想访问此类属性,请在原始类定义中标记为“public”。

var_dump 之所以能够访问,是因为它是一个内部函数,拥有查看整个对象的“权力”。但是,您的代码没有这种能力。

我不会推荐它,但是如果你真的需要访问一个私有属性,你可以使用PHP Reflection来实现它。

于 2012-04-20T16:13:12.877 回答
1

外部代码需要的私有属性通常有一个公共方法来读取它们,在这种情况下它是getItems().

$items = $_SESSION['PHPurchaseCart']->getItems();
于 2012-04-20T16:16:58.043 回答
0

我看到它是私有的,但我不禁想知道为什么 var_dump 可以向我显示属性包含的内容但我无法读取数据,因为它会引发致命错误?

请理解您应该使用所选答案中解释的 getter 和 setter 方法。

但是为了完成为什么以及如何阅读它(有助于调试)。好吧,值在那里,但私有方法被 NULL 字节(ASCII 值 0)包围。

所以如果你真的想用var_dump();

$key = "\0_items\0";
var_dump($fun->$key);
于 2017-08-18T13:39:53.410 回答