Почему var_dump устанавливает значения частных переменных, но при попытке доступа к одному свойству

У меня есть объект, который бросается в массив сеансов, и я хочу запустить foreach в свойстве items.

Кажется, я не могу получить к нему доступ. Я вижу, что это конфиденциально, но я не могу не задаться вопросом, почему var_dump может показать мне, что содержит свойство, но я не могу прочитать данные, поскольку он вызывает фатальную ошибку?

Я полагаю, что могу сделать некоторую буферизацию вывода и оценить var_dump как строку, если мне действительно понравится это, но похоже, что должен быть лучший метод. Любые идеи, как я могу получить доступ к файлам?

Код объекта 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; 

Вышеупомянутая ситуация вызывает фатальную ошибку.

Related of "Почему var_dump устанавливает значения частных переменных, но при попытке доступа к одному свойству"

Это идея частных свойств: вы не можете получить к ним доступ. Вы действительно не должны нарушать эту концепцию. Если вы действительно хотите получить доступ к такому свойству, отметка будет «общедоступной» в первоначальном определении класса.

Причина, по которой var_dump может получить доступ к ней, заключается в том, что она является внутренней функцией и имеет «власть» для просмотра всего объекта. Однако ваш код не имеет такой мощности.

Я бы не рекомендовал его, но если вам действительно нужно получить доступ к частной собственности, вы можете использовать PHP Reflection для его достижения.

Частные свойства, которые необходимы внешнему коду, обычно имеют общедоступный метод для их чтения, в этом случае это getItems() .

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

Я вижу, что это конфиденциально, но я не могу не задаться вопросом, почему var_dump может показать мне, что содержит свойство, но я не могу прочитать данные, поскольку он вызывает фатальную ошибку?

Пожалуйста, поймите, что вы должны использовать методы getter и setter, как описано в выбранном ответе.

Но для завершения о том, почему и как его можно прочитать (может помочь в отладке). Ну, значение есть, но частные методы окружены NULL байтами (значение ASCII 0).

Поэтому, если вы действительно хотите увидеть это значение с помощью var_dump();

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