stdClass

Posted by muchag | PHP | 2010-07-10 (土) 19:09:33

PHP にはデフォルトで ctdClass というクラスがある。(ビルトインクラス

そのため stdClass に関しては

  1. $hoge = new stdClass();

のように宣言しなくても使える。

裏を返せば

  1. $hoge->id;

と記述することで $hoge は stdClass クラスのオブジェクト(インスタンス)として
自動認識される。
 

stdClass の生成方法
  1. // ways of creating stdClass instances
  2. $x = new stdClass;
  3. $y = (object) null;        // same as above
  4. $z = (object) 'a';         // creates property 'scalar' = 'a'
  5. $a = (object) array('property1' => 1, 'property2' => 'b');

PHPマニュアル:クラスの基礎 Notes on stdClass

#d

ctdClass を var_dump すると

  1. object(stdClass)#1 (1) {
  2.      ["id"]=>
  3.      int(2)
  4. }

こんな感じになるが、この #1 という表記の意味がわからない。

何回か試しているうちに、どうも項目IDっぽい気がしてきた。
array[0], array[1], array[2] のそれぞれに stdClass が入っている配列を var_dump してみたら
#2, #4, #5 となった。

ただし、何で 2 からなのか、何で番号が飛んでいるのかがわからない。

また、以下のサイトを参考にする限りでは、#d が付くのは PHP 5 の仕様で、PHP 4 では付かないようだ。
Shin x blog:PHP4なスクリプトをPHP5へ移行する際に発生する7つの問題
 

array_push()では参照を格納する

PHP5のオブジェクトは参照渡しが基本となっているので、array_push()でもオブジェクトの参照が連想配列に格納されます。
ですのでループ内等で連続でarray_push()する際は注意する必要があります。

下の例ではPHP4.1.2ではidが異なるオブジェクトが格納されていますが、PHP5.1.6ではどちらも同じidになっているのが分かります。

  1. <?php
  2. $array = array();
  3. $a = new stdClass;
  4. for ($i = 1; $i <= 2; $i++) {
  5.   $a->id = $i;
  6.   array_push($array, $a);
  7. }
  8. var_dump($array);
  9. // PHP4.1.2
  10. // array(2) {
  11. //   [0]=>
  12. //   object(stdClass)(1) {
  13. //   ["id"]=>
  14. //   int(1)
  15. //   }
  16. //   [1]=>
  17. //   object(stdClass)(1) {
  18. //   ["id"]=>
  19. //   int(2)
  20. //   }
  21. // }
  22. // PHP5.1.6
  23. // array(2) {
  24. //   [0]=>
  25. //   object(stdClass)#1 (1) {
  26. //   ["id"]=>
  27. //   int(2)
  28. //   }
  29. //   [1]=>
  30. //   object(stdClass)#1 (1) {
  31. //   ["id"]=>
  32. //   int(2)
  33. //   }
  34. // }

PHP5ではオブジェクトを毎回newするか__cloneする必要があります。

  1. <?php
  2. // new
  3. $array = array();
  4. for ($i = 1; $i <= 2; $i++) {
  5.   $a = new stdClass;
  6.   $a->id = $i;
  7.   array_push($array, $a);
  8. }
  9. var_dump($array);
  10. // clone
  11. $array = array();
  12. $a = new stdClass;
  13. for ($i = 1; $i <= 2; $i++) {
  14.   $b = clone $a;
  15.   $b->id = $i;
  16.   array_push($array, $b);
  17. }
  18. var_dump($array);

<引用元(含コード)>
Shin x blog:PHP4なスクリプトをPHP5へ移行する際に発生する7つの問題

PHP | 2010-07-10 (土) 19:09:33 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment