Home > PHP > foreachでIndirect modification of overloaded propertyが発生する

foreachでIndirect modification of overloaded propertyが発生する

  • 2006-11-21 (火) 0:02
  • PHP
この記事の所要時間: 222

マジックメソッドの__get()ですが、配列を返すとforeachでNoticeが発生する場合があります。

< ?php
error_reporting(E_ALL);

class A {
  private $array = array(1, 2, 3);

  function __get($name) {
    if ($name == 'hoge') {
      return $this->array;
    }
  }
}

$obj = new A();
foreach ($obj->hoge as $elem) {
  var_dump($elem);
}
?>
PHP Notice:  Indirect modification of overloaded property A::$hoge has
 no effect in __get.php on line 15

The reason for this is that __get() only returns variables in read mode, while foreach() wants a variable in read/write mode as it tries to modify the internal array pointer. As it can’t do this PHP 5.2 will now throw a warning on this.

Overloaded properties (__get) – Derick Rethans

理由はforeachではread/writeモードが要求されるのに__get()ではreadモードの値が返されるためのようです。__get()がreadモードで返すのは当然のような気がしますがちと不便ですね。

対策としては__get()内で(array)でキャストするか

< ?php
  function __get($name) {
    if ($name == 'hoge') {
      return (array)$this->array;
    }
  }
?>

__get()の値を別の変数に代入すれば良いようです。

< ?php
$array = $obj->hoge
foreach ($array as $elem) {
?>

この現象は5.2.0で発生し、5.1.6ではNoticeはでませんでした。__get()は便利で何だか使いたくなる機能ですが、配列を返す場合は注意しましょう。

Pocket

follow us in feedly

トラックバック:2

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2006/11/php___get_array.html/trackback
Listed below are links to weblogs that reference
foreachでIndirect modification of overloaded propertyが発生する from Shin x blog
pingback from 青空 » PHP 5.2.x 에서 발생하는 새로운 Notice 07-09-25 (火) 16:40

[…] 답변이라는게… 버그라면서 5.2.1은 버그 픽스가 되어 있다는 것이었다. – 마지막 부분에 blueskysora 라는 ID는 나이다. –;;; 답변 있쟈나~ 라고 오해 마시길… ^^; – 서버에 설치된 PHP의 버젼은 5.2.2 가아닌가??? 버그가 아닌 모양이다. 계속 구글링… 이런, 저런, 고런, 요런 등의 수많은 사이트가 나온다. 결국 버그가 아니라, 버젼업이 되면서 문법이 더욱 견고하게 다져졌다는 것으로 생각했다. 한마디로 적당히 코딩하지 말라는 거다. […]

pingback from SpaceTime - PHP 5.2.x 에서 발생하는 새로운 Notice 08-02-29 (金) 15:33

[…] blueskysora 라는 ID는 본인이다. –; 답변 있잖아~ 라고 오해 마시길… ^^; – 서버에 설치된 PHP의 버젼은 5.2.2 가아닌가??? 버그가 아닌 모양이다. 계속 구글링… 이런, 저런, 고런, 요런 등의 수많은 사이트가 나온다. 결국 버그가 아니라, 버젼업이 되면서 문법이 더욱 견고하게 다져졌다는 것으로 생각했다. 한마디로 적당히 코딩하지 말라는 거다. […]

Home > PHP > foreachでIndirect modification of overloaded propertyが発生する

検索
フィード
メタ情報

Return to page top