关于php:为什么var_dump可以确定私有变量的值,但是在尝试访问单个属性时它不能

Why can var_dump ascertain values of private variables, yet it can't when trying to access a single the property

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

我好像不能进入。我看到它是私有的,但我禁不住想知道为什么var_dump可以向我显示属性包含的内容,但是我无法读取数据,因为它抛出了一个致命的错误?

如果我真的需要这样做的话,我想我可以做一些输出缓冲,并将var_dump作为一个字符串进行计算,但似乎应该有一个更好的方法。我有什么办法可以进入物品吗?

var_dump($_SESSION['PHPurchaseCart'])转储的对象代码var_:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
}

我尝试访问它的方式:

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

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


这就是私有财产的概念:你不能访问它们。你真的不应该打破这个概念。如果确实要访问此类属性,则在原始类定义中标记为"public"。

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

我不建议这样做,但是如果您确实需要访问私有属性,可以使用PHP反射来实现它。


外部代码需要的私有属性通常有一个公共方法来读取它们,在本例中是getItems()

1
$items = $_SESSION['PHPurchaseCart']->getItems();


I see that it's private, but I can't help but wonder why var_dump can show me what the property contains yet I can't read the data as it throws a fatal error?

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

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

所以如果你真的想用EDOCX1[1]看到这个值

1
2
$key ="\0_items\0";
var_dump($fun->$key);