3

セッション配列にスローされているオブジェクトがあり、itemsプロパティでforeachを実行したいと思います。

アクセスできないようです。プライベートであることがわかりますが、var_dumpでプロパティの内容が表示されるのに、致命的なエラーが発生するためデータを読み取れないのはなぜかと思わずにはいられません。

本当にこれが好きな場合は、出力バッファリングを実行してvar_dumpを文字列として評価できると思いますが、もっと良い方法があるはずです。_itemsにアクセスする方法はありますか?

オブジェクトコードvar_dumpedfrom 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

それが私有財産の考え方です。あなたはそれらにアクセスすることはできません。あなたは本当にこの概念を破るべきではありません。このようなプロパティに本当にアクセスしたい場合は、元のクラス定義で「パブリック」としてマークを付けます。

var_dumpがアクセスできる理由は、var_dumpが内部関数であり、オブジェクト全体を表示する「能力」を備えているためです。ただし、コードにはその力がありません。

私はお勧めしませんが、本当にプライベートプロパティにアクセスする必要がある場合は、PHPReflectionを使用してそれを実現できます。

于 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 に答える