PHP4에서 foreach는 call-by-value!

Document URL : http://seungyeop.kr/4182
Posted on January 19th, 2008 at 01:35 by haneul | Modify

전에 짰던 lifepod 모듈에 대한 여러 버그 리포트가 있었는데요.

시간이 lifepod에서 세팅한 것과 항상 일정하게 차이가 난다는 버그 리포팅이 많이 있었습니다.

그래서 몇몇 분들의 홈페이지를 찾아가보니까 분명히 시간을 다시 계산해서 넣어준 것이 원래 lifepod에서 받아온 폼 대로 그대로 있는 문제가 있더라구요.

 

한참 고민을 하다가 안되겠어서; PHP4를 깔아서 확인해보니!;

범인은 바로 foreach였습니다.

PHP5에서는 잘 되길래 안심하고 있었는데, foreach의 동작이 PHP4랑 PHP5랑 다르네요 orz

예를 들어, 다음과 같은 코드가 있다고 하면

  1. <?
        $test = array();
        $obj->check = "test";
        $test[] = $obj;
        print_r($test);
        foreach($test as $key=>$val)
        {
            $val->check = "hihi";
        }
        print_r($test);
    ?>

 

PHP5에서는

Array
(
    [0] => stdClass Object
    (
   [check] => test
   )
)


Array
(
    [0] => stdClass Object
    (
   [check] => hihi
   )
)

 

 

이런 결과가 나오는 반면,
PHP4에서는

Array
(
    [0] => stdClass Object
   (
   [check] => test
   )
)


Array
(
    [0] => stdClass Object
    (
   [check] => test
   )
)

 

 

이런 결과가 나옵니다. 즉, PHP5에서는 Array를 foreach로 돌 때, Object를 Call-by-Reference로 보내주는데, PHP4에서는 Call-by-Value로 넘겨주는 것 때문에 문제였던 거에요

이런식으로 동작할 줄은.. 꿈에도 상상을 못했기 때문에 -_-a

버그를 찾는데 한참 걸렸네요 ;;

 

많이들 알고 계시겠지만, PHP4, 5를 동시에 지원할 때는 주의하셔요 :)

Tagged :
   

Trackbacks : 0

Trackback URL : http://seungyeop.kr/blog/4182/4a3/trackback

Comments : 18

Author zero
2008.01.19 at 01:47:23
댓글 | |

php의 경우 call by ref. 로 넘겨줄때 function의 args에 &로 명시적인 지정이 가능한데 php5에서는 무조건으로 되기도 했지요.

왜 그렇게 했는지 잘 이해가 안되요. ㅎㅎ

아무튼 php4, php5 둘다 작업하면서 꼭 std class나 array 사용시 null을 대입하여 초기화 하는 작업이 이제 버릇처럼 되고 있네요.

아무튼 고생 많으셨습니다. ^^ 

Author haneul
2008.01.19 at 02:16:02
댓글

ㅎㅎ 그러게요; 일관성이 중요한데 말이죠 ㅠ

저도 습관을 잘 들여야겠습니다;;

ㅎㅎ 저보단 제로님이 고생이 ;;

Author daybreaker
2008.01.20 at 18:48:34
댓글 | |

php가 버전이 올라가면서 언어 스펙이 바뀌거나 똑같은 문법이어도 의미하는 바가 달리지기도 하고, 또 같은 기능을 하지만 인자 순서만 다른 다른 이름의 함수들이 여러 개 있는 등 일관성이 없어서 별로 좋아하지는 않죠.. 하지만 php가 대세(?)라서 어쩔 수 없이 쓴다는 거. ㅠㅠ;

텍스트큐브에서도 비슷한 문제로 고생했다는 얘길 들어봤습니다.

Author haneul
2008.01.20 at 21:01:33
댓글

그러게요 PHP가 대세라서 orz;