- ベストアンサー
PHP4でメンバ変数の値を忘れてしまう2
- PHP4での質問です。オブジェクトのメンバ変数を直接外部から変更したい場合、(1)のデバッグライトではメンバ変数の値は1であるのに、(2)のデバッグライトでは0になってしまいます。この原因が分かる方、お知恵をお貸し下さい。
- PHP4での質問です。オブジェクト指向的ではない方法で、オブジェクトのメンバ変数を直接外部から変更したい場合、メンバ変数の値が(1)のデバッグライトでは1であるのに、(2)のデバッグライトでは0になってしまいます。この原因が分かる方、お知恵をお貸し下さい。
- PHP4での質問です。オブジェクト指向的でない方法で、オブジェクトのメンバ変数を直接外部から変更したい場合、メンバ変数の値が(1)のデバッグライトでは1であるのに、(2)のデバッグライトでは0になってしまいます。この原因が分かる方、お知恵をお貸し下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
がるです。 んと…おおむね自己解決されているようなのですがw > 恐らく、foreachではオブジェクトのコピーをas以下に作り出すとかそんな仕様なのではないかと思います。 です。 たとえば… http://www.php.net/manual/ja/control-structures.foreach.php をご覧ください。 >> 注意: 配列が リファレンス でない限り、foreachは、指定した配列自体に対してではなく、 そのコピーに対して処理を行います。このため、 each() 文のように配列のポインタ位置が変更され ることはなく、返される配列要素への変更は、元の配列には反映されません。 しかし、元の配列の内部ポインタは、配列の処理に伴い前に進められます。 foreachループが完了した時点で、 配列の内部ポインタは、配列の最後を指すことになります。 << …まぁ困った仕様ではありますね(苦笑
その他の回答 (1)
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んと…上述のコードで、(2)で1が出力されているのですが(PHP4で試しました)。 もし「抜き出した部分的ソース」だとすると、単純にどこかで値を触ってしまっている可能性が高いように考えられます。
お礼
がる様 この問題は、ソースが複雑でしたので、手で書き直して質問したのですが、その際に最低な事に、ソースを謝って移植して公開してしまいました。すみませんでした。 本来は、 ---------<a.php>---------- class myClass { var member = 0; } ---------<b.php>---------- $ary_c = array(); for ($i=0; $i<10; $i++) { $c = new myClass(); array_push($ary_c, $c); } foreach ($ary_c as $c) { ★NG1 $c->member = 1; // ★NG2 echo "(1)c->member=".$c->member; } foreach ($ary_c as $c) { echo "(2)c->member=".$c->member; } ------------------------------ 以上のようなソースでした。 で、★NG1を for($i=0; $i<count($ary_c); $i++) { に、 ★NG2を $ary_c[$i]->member = 1; に変更したところ、問題が解決しました。 恐らく、foreachではオブジェクトのコピーをas以下に作り出すとか そんな仕様なのではないかと思います。 大変不可解な(そもそも間違った)ソースをあげて質問をしてしまい、 申し訳ございませんでした。
お礼
がる様 なるほど! 分かってしまえばですが、foreachの仕様書(リファレンス)に書いてあったのですね。 お陰様で、正確に理解できました。 この度はありがとうございました。 つたない質問でご迷惑をおかけしましたm(__)m