2014-02-12 3 views
0

저는 PHP에 대해 배우기 만하고 다음 코드 스 니펫과 다른 결과를 얻는 이유를 이해할 수 없습니다.PHP 변수 - 예기치 않은 결과

니핏 1

<?php 
    $x = 22; 
    $y = 12; 
    $counter = 0; 

    function add() 
    { 
     if ($GLOBALS['counter'] == 0) 
     { 
      $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
     } 
     else 
     { 
      $GLOBALS['z'] += $GLOBALS['y']; 
     } 
     $GLOBALS['counter'] ++; 
    } 

    add(); 
    echo "$z <br>"; 
    add(); 
    echo "$z <br>"; 
?> 

제 34 복귀 예상대로 46.

코드 조각 2 :

<?php 
    $x = 22; 
    $y = 12; 
    $counter = 0; 

    function add() 
    { 
     if ($GLOBALS['counter'] == 0) 
     { 
      $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
     } 
     else 
     { 
      $GLOBALS['z'] += $GLOBALS['y']; 
     } 
     $GLOBALS['counter'] ++; 
    } 

    for ($x=0; $x < 2; $x++) 
    { 
     add(); 
     echo "$z <br>"; 
    } 
?> 

두 번째 리턴 (12), (24)

이 매우 간단 들릴 수는 있지만 솔직히이 작동하지 않는 이유를 작동하지 않을 수 있습니다.

도움을 주시면 감사하겠습니다.

+0

내가 만약을 만들 때 당신의 논리를 이해하십시오. x를 0으로 설정하면 12와 24를 얻게 될 것이기 때문에 for ($ counter = 0; $ counter <2; $ counter ++)를 사용하면 안됩니다. – Karl

+1

You '$ x'을 (를) 'for' 루프의 또 다른 값. 전역을 사용하여 피해야합니다. 디버깅하기 어렵고 테스트를 방해하며 일반적으로 싫어합니다. – Wrikken

답변

1

루프 카운터에 변수 이름 $x을 다시 사용하고 있습니다. $x0으로 설정하면 $_GLOBALS['x'] + $_GLOBALS['y'] 일 때 0 + 12이됩니다. 이 이름을 아직 사용하지 않는 이름으로 변경해야합니다. 나는 $i로 변경하는 것이 좋습니다 :

for ($i = 0; $i < 2; $i++) 
{ 
    add(); 
    echo "$z <br>"; 
} 

나는 또한 일반적으로 $_GLOBALS을 사용하지 않는 것이 좋습니다.

+0

나는 그것을 알지 못한다고 나는 믿을 수 없다! 모두의 답변에 많은 감사드립니다. –

0

당신은 당신은 ... 이전에서 x의 정의를 덮어

for ($q=0; $q < 2; $q++) 
{ 
    add(); 
    echo "$z <br>"; 
} 

당신이 볼에 변경

for ($x=0; $x < 2; $x++) 
{ 
    add(); 
    echo "$z <br>"; 
} 

루프 ...