본문 바로가기

Web Development/PHP

[PHP] 제어 구조에 대해서

제어구조

제어구조는 PHP의 흐름을 제어하는 구조입니다.

이말은 사용자의 특정 조건을 받아서 해당 조건에 맞는 실행을 하라는 구조입니다.

 

if문

if 문은 제어 구조의 가장 기초가 되는 부분입니다.
말그대로 조건이 참이면 다음 내용을 실행하라는 것입니다.

예제1

<?
    $a = 1;
    $b = 0;
 
 //괄호안이 참이면 다음을 실행
    if ( $a > $b )
 {
        echo "$a 는 $b 보다 크다.";
    }
?>
 

예제2

<?
    $a = 100;
    $b = 30;
 
    if ( $a != $b )
   {
        echo "값이 다르다";
    }
?>


예제3

<?
    $a = 0;
 
    if ( $a )
 {
        echo "조건이 참입니다.";
    }
?>


예제4

<?
    $a = 5;
 
    if ( $a )
 {
        echo "조건이 참입니다.";
    }
?>


예제5

<?
    $a = "";
 
    if ( $a )
        echo "조건이 참입니다.";
?>

 

예제에서 보듯이 if 구문은 if ( 조건부 ) { 실행부 } 와 같은 형식으로 사용합니다..
조건부가 참인 경우 실행부 안을 실행하게 되는 것입니다.

참고1.
위 소스처럼 중괄호 안이 한 줄인 경우 중괄호의 생략이 가능합니다.

참고2.조건문에 변수만 오게되면 숫자일경우 0이면 거짓 그외의수는 참이며

문자일경우 빈공간은 거짓이며 문자가 있을시는 참입니다.

 

else문

else 구문은 if 문에서 괄호안의 결과가 FALSE 인 경우 즉, 거짓인 경우 실행합니다.

예제1

<?
    $a = 1;
    $b = 0;

    if ( $a > $b )

    { //괄호안이 참이면 다음을 실행
        echo "$a 는 $b 보다 크다.";
    }
    else

    { //괄호 안이 거짓인 경우
        echo "$a 는 $b 보다 작다.";
    }
?>


예제2

<?
    $a = 200;
    $b = 180;

    if ( $a <= $b )
 {
        echo "$a 는 $b 보다 작거나 같다.";
    }
    else
 {
        echo "$a 는 $b 보다 크다.";
    }
?>

elseif문

elseif 구문은 else와 if를 합쳐놓은 것과 같습니다

예제1

<?
    $a = 1;
    $b = 0;

    if ( $a > $b )
 {
        echo "$a 는 $b 보다 크다.";
    }
    elseif ($a == $b)
 {
        echo "$a 는 $b 와 같다.";
    }
    else
 { //괄호 안이 거짓인 경우
        echo "$a 는 $b 보다 작다.";
    }
?>

elseif 는 반드시 위의 if 구문이 거짓이고 elseif 구문이 참일 때 중괄호가 실행됩니다.
if-else문은 자주 쓰이기 때문에 잘 이해하셔야 합니다.

while문

while은 어떤 블록을 계속적으로 반복해야 할 때 사용합니다.
이렇게 블록을 반복하여 수행하는 것을 루프라고 하는데, while의 경우 조건절이 참일 경우 무한 반복하게 됩니다.

예제1

<?
    $i = 1;
    while ($i <= 10)
 { //구문이 참이면.. 중괄호부분을 무한반복
  echo $i++;
        //$i 가 1씩 계속 증가하니 10번 반복하면 끝나겠지요?
    }
?>

위의 소스에서 보시다시피 변수 $i는 실행시마다 1씩 증가하며 구문은 변수 $i의 값을 매번 체크하여
참일 경우 다시 실행 시키게 됩니다.
따라서 while 구문은 10번 실행후 자동 종료됩니다.

예제2

<?
    $i = 5;
    while ($i <= 8)
 {
  echo "윤정이 내꺼<br>";
    }
?>

do .. while문

do .. while 구문은 while 문과 유사하지만 조건절이 뒤에 있기 때문에
반드시 한번은 실행을 된다는 차이가 있습니다.

예제1

<?
    $i = 0;
    do { //우선 한번 무조건 실행하고 본다..
        echo $i;
    } while ( $i >0 ) // $i 가 0보다 크면 다시 반복
?>

무조건 한번 실행하고 조건절을 판단하므로 위와 같은 결과를 내게 됩니다.
만약 while 문을 썼다면 아무 결과도 안나왔을겁니다.
while 의 경우엔 처음부터 조건절을 확인하여 참인 경우만 반복하기 때문입니다.

 

우리의 목표는?

for문

for 문은 while과 같은 루프이며 반복문입니다.
for (expr1; expr2; expr3) statement; 와 같은 형식을 가지며 expr1 이 무조건 한번 실행된 후에

expr2 조건을 검사합니다. expr2가 참이면 statement를 실행하고
statement가 모두 실행되면 expr3를 실행합니다.
소스를 보며 이해해 BOA요!

예제0

<? 
    for ($i=1; $i <=10; $i++)

    echo $i;
?>


예제1

<? 
    for ($i=1; $i <=10; $i++)
    {
        echo $i;
    }
?>

위의 소스는 1 부터 10까지 출력하는 프로그램입니다.

명령이 한줄이면 {}를 사용안해도 됩니다. {}는 명령이 2줄 이상일때 사용합니다.


예제2

<?

 for($num=10;$num>=1;$num=$num-2)
 {
    echo "$num 입니다.";
    echo "<br>";
 }
?>

위의 소스는 10부터 2까지 2의 배수로 출력하는 프로그램입니다.

예제3

<?
    for($num=1;$num<100;$num=$num+1);
?>

위의 소스는 1부터 99까지 그냥 연산없이 실행되는 프로그램입니다.
보통 시간을 보내기 위해 사용합니다.

break문

break 문은 위에서 배운 for 와 while 같은 루프를 빠져나오는 명령입니다.
루트를 빠져나온다는 애기는 정해진 반복횟수를 채우지 않고 도중에 반복을 중단한다는 애기입니다.

예제1

<?
 for ($i = 1;$i<20;$i++)
 {
        if ($i >10 )
        {
            break; // 루프를 빠져나감
        }
        echo $i;
    }
?>

위의 소스는 1부터 19까지 19번의 반복문을 실행합니다.

이때 if문 조건문에서 10보다 크게되면 break를 실행시켜서
현재 돌고 있는 반복문을 실행종료하고 다음문장을 실행합니다.

예제2

<?
 $i=1;
 for (;;)
 {
    if ($i > 10)
    {
         break;
    }
    echo $i;
    $i++;
 }
?>

for(;;)는 에러가 아닙니다. 무한 루프를 도는것입니다.
하지만 break문을 만나서 10보다 커지면 반복문을 중단합니다.

continue문

continue는 break와 달리 반복문을 실행 종료하는게 아니라
루프의 처음으로 돌려 보내는 명령입니다.

다음 소스를 보십시오.

예제1

<?
 for($num=1;$num<10;$num++)
 {
  if ($num==5)
  {
   continue;
  }
  echo $num;
 }
?>

위의 소스는 9번의 실행을 합니다.
1부터 출력을 하다가 5가되면 continue가 되어서 출력을 하지않고 다시 반복조건으로 이동합니다.
한마디로 continue문뒤에 실행문을 실행않고 다시 조건으로 갑니다.

예제2

<?
$i = 0;
while ($i++ < 3) { //세번만 실행해보도록 하겠습니다.
     echo "첫번째 루프<br>\n";
     while (1) {
        echo "  두번째 루프<br>\n";
         while (1) {
              echo "  세번째 루프<br>\n";
              continue 3;
         }
         echo "절대 안나오지롱~<br>\n";
    }
    echo "나도 나오게 해줘 제발~ ㅜㅜ<br>\n";
}
?>

continue;는 continue 1;과 같다. 현재 속한 반복문으로 간다.

3이면 현재 속하고 속하고 속한 반복문으로 반복문의 갯수만큼 상위로 간다는 뜻입니다.

2이면 현재 속하고 속한 반복문으로 반복문의 갯수만큼 상위로 간다는 뜻입니다.

switch문

switch문은 if문과 비슷한 조건문입니다. 다음의 소스를 보십시오.

예제1

<?

//if문으로 표현했습니다.

if ($i == 0) {
    print "i 는 0";
}
if ($i == 1) {
    print "i 는 1";
}
if ($i == 2) {
    print "i 는 2";
}

//switch문으로 표현했습니다.

switch ($i) {
    case 0:
        print "i 는 0";
        break; //끝에 꼭 break문을 넣습니다.
    case 1:
        print "i 는 1";
        break;
    case 2:
        print "i 는 2";
        break;
}
?>

위 소스에서 보듯이 switch 문은 if 문을 여러 개 정렬해놓은 것과 같습니다.
예를 들면 90점은 A, 80점은 B, 70은 C 같이 등급을 매길 때 유용하게 쓸 수 있습니다.
근데 50점 이하는 모두 F를 주고 싶다고 할때 귀찮게 50 40 30 모두 case를 만들기는 좀 미련해보입니다.
이럴 때 default를 쓰면 됩니다.
case로 지정안된 모든 값은 default 값으로 정해지는 겁니다.
case 처럼 default : 이렇게 쓰면 되구요.. break는 쓸 필요가 없습니다.

예제2

<?
if ($i == 0) {
    print "i 는 0";
}
elseif ($i == 1) {
    print "i 는 1";
}
elseif ($i == 2) {
    print "i 는 2";
}
else {
    print "i는 0,1,2가 아니다";
}

switch ($i) {
    case 0:
        print "i 는 0";
        break;
    case 1:
        print "i 는 1";
        break;
    case 2:
        print "i 는 2";
        break;
    default :
        print "i는 0,1,2 가 아니다";
}
?>


여기서 잠깐

if와 switch 문중 무엇이 더빠를까요? switch문이 더 빠릅니다.
이유 는 if else 문은 해당값이 1이든 마지막 50이든 무조건 제어문을 전부 실행하기 때문에
실행 시간이 같지만 switch 문은 만약 첫번째에서 답이 있다면 그부분을 실행후 뒤에 부분은 실행하지 않습니다.
(switch의 break) 그래서 값이 1일경우와 50일경우 실행 시간이 다릅니다.

require()와 include()

위의 2개의 함수는 외부 파일을 포함시키는 기능을 합니다.

자주쓰이는 함수들을 하나의 파일로 만들어서 포함시키거나 많은양의 소스를 하나의 파일로 만들어서 포함시킵니다.

아래의 형식으로 사용합니다.

require('somefile.html');

include('somefile.html');

예제1

index.php

<?

echo "자기씨!";

include "index2.php";//해당 파일을 포함시킨다.

?>

index2.php

<?

echo "<br>";

echo "나야! 이서방!";

?>

예제2

index.php

<?
$num=12;
echo "변수도 공유될까?";
include "index3.php";
?>

index3.php

<?
 echo "출력 : $num";
?>

예제3

index.php

<?
 echo "php파일이나 html파일 모두 포함됩니다.";
 echo "<br>";
 include "index2.html";
?>

index2.html

<b>무히히히 <font color=red>html</font>도 된당 돼</b>

 

여기서잠깐

여기서 주의해야 할 점이 있습니다.
include()문이 파일로 대체된다고 해서 파일에 <? ?> 를 빼버린다면 소스가 전부 출력됩니다.

조심하세요.

위의 예제들의 include()을 require() 문으로 대체해도 똑같은 결과를 얻을 수 있습니다.
그럼 왜 불필요하게 같은 기능을 하는게 두개가 있을까?  하는 의문을 생깁니다.
답부터 말씀드리면 둘은 똑같지는 않기때문입니다.

기능이 비슷하긴 하지만 엄연히 다른부분이 있습니다.

 

require()와 include()의 차이점

PHP4 부터는 require 와 include 가 두가지 점을 제외하고 동일한 기능을 합니다.

첫 번째, require 는 수행실패시 Fatal Error 를 내고 프로그램이 그 자리에서 종료됩니다.
뒤에 다른 PHP 코드가 있더라도 말입니다.
그러나 include 는 수행실패시 Warning 만 출력하고 나머지 코드를 모두 수행합니다.

두번째,require가 include보다 속도가 빠르다.
그래서 함수정의나 db정보는 require를 사용하고
일반적인 웹페이지는 include를 사용합니다.

 

return

return 은 함수에서 사용하는 제어 구조입니다.
함수 내부에서 함수의 수행을 중단하고 함수 호출 결과를 return 의 인자로 넘겨줍니다.

예제1

<?
function add ($a,$b) {
   
    $sum = $a + $b;
    return $sum;
    echo "나는 절대 출력안됩니다.";
}

$result = add(10,20);
echo $result;
?>

위처럼 함수를 호출한 결과를 return을 통해 전달하고 전달된 인자는 $result 변수에 저장이 됩니다.
결과는 30
그러나 함수내의 echo 문은 절대로 수행이 되지 않는데요.
그 이유는 return 때문에 함수 수행이 종료되기 때문입니다.

 

너의 목소리가 들려 ♬♪