为啥 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 可以确定私有变量的值,但在尝试访问单个属性时却不能的主要内容,如果未能解决你的问题,请参考以下文章