为啥 var_dump 可以确定私有变量的值,但在尝试访问单个属性时却不能

Posted

技术标签:

【中文标题】为啥 var_dump 可以确定私有变量的值,但在尝试访问单个属性时却不能【英文标题】:Why can var_dump ascertain values of private variables, yet it can't when trying to access a single the property为什么 var_dump 可以确定私有变量的值,但在尝试访问单个属性时却不能 【发布时间】:2012-05-02 05:46:48 【问题描述】:

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

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

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

来自var_dump($_SESSION['phpurchaseCart'])的目标代码var_dumped:

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;

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

【问题讨论】:

var_dump 查看对象内部。如果您也想这样做,请使用反射。 【参考方案1】:

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

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

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

【讨论】:

其实我并没有为那个对象写代码,但是我在上面使用了一个get_class_methods,找到了一个内部函数来给我我需要的东西,这基本上就是你想要我添加的( : oooo!我不知道反射。谢谢你指点我!【参考方案2】:

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

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

【讨论】:

是的,我在发布后对其进行了 get_class_methods 以找到它。但我仍然对 var_dump 的事情感到好奇。倒影似乎很有趣。【参考方案3】:

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

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

但是为了完成阅读的原因和方式(有助于调试)。好吧,值在那里,但私有方法被 NULL 字节(ASCII 值 0)包围。

因此,如果您真的想通过 var_dump(); 看到该值

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

【讨论】:

以上是关于为啥 var_dump 可以确定私有变量的值,但在尝试访问单个属性时却不能的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的函数不能访问它所在类的私有变量 INSIDE?

echo(),print(),print_r(),var_dump()函数的区别

为啥我可以从 main 方法访问私有变量?

为啥我可以在复制构造函数中访问私有变量?

为啥它不改变这些变量的值? [关闭]

PHP中var_dump是啥意思