Skip Navigation

XE 레이아웃 카메론 XE LAYOUT CAMERON XE1.9.8.4


PHP »  언어레퍼런스 »  07절.제어구조
KO
조회 수 59 추천 수 0 2018.05.13 22:53:26
부운영자 *.185.23.199

edit소개

 

모든 PHP 스크립트는 연속적인 구문으로 이루어진다. 하나의 구문은 지정문 이 될수도 있고, 함수 호출, 반복문, 조건문이 될수 있으며 심지어는 아무 내용이 없는 빈 문장일수도 있다. 한 구문은 보통 세미콜론(;)으로 끝난다. 또한 여러개의 구문을 중괄호({,})를 사용하여 하나의 그룹으로 만들어 사용할 수도 있다. 이 구문 그룹은 그 그룹의 모든 구문들이 하나의 구문인 것처럼 인식된다. 이 장에서는 여러 가지 구문형태에 대해 알아본다.

 

editif

 

if문은 PHP를 포함해서 모든 언어에 있어서 가장 중요한 기능 중 하나이다. 이 제어문으로 각각 다른 코드에 대해 조건적인 수행을 가능케한다. if문의 기능은 C와 비슷하다:

if (expr)
    statement

 

표현식에 관한 섹션에서 설명된것처럼 expr은 논리(Boolean)값으로 취급된다. expr이 TRUE와 같다면 PHP는 statement를 수행할것이고, FALSE라면 무시될것이다. 무슨값이 FALSE인지 알려면 '논리값으로 변환하기' 섹션을 참고한다.

 

다음 예는 $a가 $b보다 크다면 a는 b보다 크다를 출력할 것이다.

 

<?php
if ($a > $b)
    echo "a는 b보다 크다";
?>

 

종종 하나 이상의 구문을 조건적으로 수행시켜야 하는 때가 있다. 물론 if절로 각 구문을 감싸줄 필요는 없다. 대신, 구문 그룹안에 몇개의 구문을 그룹화할 수 있다. 예를 들면, 이코드는 $a가 $b보다 크다면 a는 b보다 크다라고 출력할것이고, $a의 값을 $b로 지정하게 될것이다.

 

<?php
if ($a > $b) {
    echo "a는 b보다 크다";
    $b = $a;
}
?>

 

If문은 다른 if문안에 무한정으로 내포될수 있다. 이와 같은 기능은 프로그램의 여러부분을 조건적으로 수행하기 위한 유연성을 제공한다.

editelse

 

가끔은 특정 조건에 맞을때 구문을 수행하지 않고, 조건과 맞지 않을 때 다른 구문을 수행하게 하고 싶은 때가 있다. else 문은 이 목적을 위한 것이다. if문 다음의 else문은 if구문안의 표현식이 FALSE일때 수행된다. 예를 들면, 다음 코드는 $a가 $b보다 크다면 a는 b보다 크다 를 출력할것이고, 그렇지않다면 a는 b보다 크지 않다를 출력할것이다:

 

<?php
if ($a > $b) {
    echo "a는 b보다 크다";
} else {
    echo "a는 b보다 크지 않다";
}
?>

 

else문은 if문이 FALSE일때만 수행이 된다. 그리고 그들 모두 FALSE값이 될수있다면 elseif문 을 쓸수 있다. (elseif를 참고)

editelseif/else if

 

elseif, 이 이름에서 알수 있듯이, if와 else의 조합이다. else처럼 이 구문은 if절 다음에 와서 원래 if표현식이 FALSE와 같은 경우에 다른 구문을 수행한다. 그러나, else와는 달리 elseif조건 표현식이 TRUE일 때만 대체 표현식을 수행할것이다. 예를 들면 다음 코드는 a는 b보다 크다, a는 b와 같다나a는 b보다 작다을 출력할것이다.

 

<?php
if ($a > $b) {
    echo "a는 b보다 크다";
} elseif ($a == $b) {
    echo "a는 b와 같다";
} else {
    echo "a는 b보다 작다";
}
?>

 

 

같은 if절 안에 몇개의 elseif절이 존재할수 있다. 가장 먼저 TRUE가 되는 elseif표현식이 수행될것이다. PHP에서는 'else if' (두 단어)로 쓸수 있고 'elseif' (한 단어) 와 방식은 같다. 문장적(syntactic)으로는 다르다 (C에 익숙하다면, 이것은 같은 방식이다) 그러나 그 둘 모두 완전히 같은 결과를 보여줄것이다.

elseif절은 선행 if 표현식과 다른 elseif표현식이 FALSE이고, 이 elseif표현식이 TRUE일때만 수행된다.

 

Note: elseif와 else if은 위 예제처럼 대괄호를 사용할 때 정확히 같은 구문으로 간주됩니다. if/elseif 조건을 콜론을 사용해서 정의할 때, else if 처럼 두 단어로 나눠서는 안됩니다. PHP는 처리 오류로 실패합니다.

 

 

<?php

/* 부적합한 방법: */
if($a > $b):
    echo $a." is greater than ".$b;
else if($a == $b): // 컴파일 되지 않습니다.
    echo "위 줄은 처리 오류를 일으킵니다.";
endif;


/* 적합한 방법: */
if($a > $b):
    echo $a." is greater than ".$b;
elseif($a == $b): // 단어가 붙어 있는 점에 주의.
    echo $a." equals ".$b;
else:
    echo $a." is neither greater than or equal to ".$b;
endif;

?>

 

 

edit제어 구조의 대체 문법

 

PHP는 제어 구조를 위해 대체 문법을 제공한다; 즉 ifwhileforforeach, 그리고 switch. 각 경우에 대체 문법의 기본형태는 괄호열기를 콜른 (:)으로 대체하고 괄호닫기는 각각 endif;endwhile;endfor;endforeach;, 또는 endswitch;으로 대체한다.

 

<?php if ($a == 5): ?>
A는 5와 같다
<?php endif; ?>

 

위 예에서는 대체 문법으로 쓰여진 if구문안에 "A는 5와 같다" HTML 블록이 포함되어있다. 이 HTML 블록은 $a가 5와 같을때만 출력될것이다.

대체 문법은 else와 elseif문에도 적용이 된다. 다음은 elseif와 else문 과 같이 있는 if문 절의 대체 형태이다:

 

<?php
if ($a == 5):
    echo "a는 5와 같다";
    echo "...";
elseif ($a == 6):
    echo "a는 6과 같다";
    echo "!!!";
else:
    echo "a는 5도 아니고 6도 아니다";
endif;
?>

 

더 많은 예는whilefor와 if섹션에 있다.

editwhile

 

while는 PHP에서 제일 간단한 루프형이다. C와 똑같은 방식으로 동작한다. while문의 기본적인 형태는 다음과 같다:

while (expr)
    statement

while문의 의미는 단순하다. while 표현식이 계속 TRUE이면, PHP에게 내포되어있는 구문(들)을 반복 수행하도 록 하라는것이다. 표현식의 값은 루프의 시작에서 매번 체크가 된다. 그래서 이 표현식 값이 내포된 구문(들)의 수행동안에 바뀔지라도 반복(iteration) 의 끝이 아니면 수행은 끝나지 않게 된다.(루프에서 PHP가 구문을 한번수행 할때 한번 반복(iteration)이다) 시작된지 얼마안되어 while표현식이 FALSE로 판명되면, 내포된 구문(들)은 즉시 수행을 멈출것이다.

if문과 마찬가지로 중괄호나 대체문법을 사용하여 구문의 그룹을 둘러쌈으로써 while루프 안에 여러 구문을 그룹화할 수 있다.

while (expr):
    statement
    ...
endwhile;

다음 예는 모두 동일하다. 둘다 1부터 10까지의 숫자를 출력한다:

 

<?php
/* example 1 */

$i = 1;
while ($i <= 10) {
    echo $i++;  /* 출력하는 값은 증가하기
                   전의 $i입니다.
                   (post-increment) */
}

/* example 2 */

$i = 1;
while ($i <= 10):
    echo $i;
    $i++;
endwhile;
?>

 

editdo-while

 

do-while 루프는 시작부분이 아니라 각 반복(iteration)의 끝부분에서 표현식이 참인지 체크한다는것을 제외하고 while루프와 매우 비슷하다. 일반적인 while문과의 주요한 차이점은 do-while문의 첫번째 반복이 반드시 수행된다는것이다 (반복의 끝부분에서 표현식이 참인지 체크한다), 이와 같은 경우는 일반 while루프로 수행시킬수 없을것이다. (while루프에서는 각 반복의 시작부분에서 표현식이 참인지 체크되고, 시작부터 바로 그 값이FALSE이면 그 루프는 즉시 수행을 멈추게 된다)

 

다음에 do-while루프의 한가지 문법을 보인다:

<?php
$i = 0;
do {
   echo $i;
} while ($i > 0);
?>

 

위 루프는 정확히 한번 수행된다. 첫번째 반복(iteration) 이후에 표현식이 참인지 체크할때, FALSE가 되므로 ($i는 0보다 크지 않다) 루프 수행이 멈춘다.

고급 C 유저는 do-while루프의 다른 사용법에 익숙할것이다. 즉, do-while (0)으로 감싸고, break절을 사용하여 코드 블록의 중간에서 수행을 멈출수 있습니다. 다음 코드 예는 이런 경우를 보여준다:

 

<?php
do {
    if ($i < 5) {
        echo "i는 충분히 크지 않다";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
    echo "i is ok";

    /* process i */

} while (0);
?>

 

이 코드를 바로 또는 전혀 이해할수 없다고 걱정하지 마라. 이런 '기능'을 사용하지 않고도 일반 스크립트나 심지어 훌륭한 스크립트를 작성할 수 있다.

editfor

 

for루프는 PHP에서 제일 복잡한 루프이다. C와 똑같은 방식으로 동작한다. for루프의 문법은 다음과 같다:

for (expr1; expr2; expr3)
    statement

첫번째 표현식(expr1)은 루프의 시작에서 바로 조건없이 평가된다 (수행된다).

각 반복(iteration)의 시작부분에서 expr2이 평 가된다. 이 표현식이 TRUE이면 루프는 계속되고 내포된 구문(들)이 수행된다. FALSE이면, 루프 수행을 멈춘다.

expr3표현식은 각 반복의 끝부분에서 평가된다 (수행된다).

각 표현은 비어있거나 콤마로 구분한 여러 표현을 가질 수 있습니다. expr2에서, 콤마로 구분한 표현은 모두 평가되지만 결과는 마지막 부분에서만 가져옵니다. expr2이 비어있다는 것은 루프가 무제한 수행되어야 한다는 것을 의미한다 (PHP는 C처럼 TRUE로 인식) 이런 기법은 생각처럼 필요없지는 않다. 왜냐 하면 종종 for문의 표현식 대신에 break문으로 루프를 끝낼 필요가 있기 때문이다.

다음 예제 코드들을 보세요. 이 코드 모두 1부터 10까지의 숫자를 출력한다:

 

<?php
/* 예제 1 */

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

/* 예제 2 */

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

/* 예제 3 */

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

/* 예제 4 */

for ($i = 1, $j = 0; $i <= 10; $j += 1, print $i, $i++);
?>

 

 

물론, 첫번째 예제(혹은 네번째) 코드가 가장 좋은 방법이다. 그러나 for루프에서 빈 표현식을 사용해야 하는 경우도 부딪히게 될것이다.

PHP는 for루프에 대한 대체 "콜른 문법"을 지원한다.

for (expr1; expr2; expr3):
    statement
    ...
endfor;

많은 사용자가 아래 예제처럼 배열을 탐색합니다.

 

 

<?php
/*
 * 이 배열은 루프를 도는 동안
 * 변경할 데이터를 가지고 있습니다.
 */
$people = Array(
        Array('name' => 'Kalle', 'salt' => 856412),
        Array('name' => 'Pierre', 'salt' => 215863),
        );

for($i = 0; $i < sizeof($people); ++$i)
{
    $people$i'salt' = rand(000000, 999999);
}
?>

 

문제는 두번째 표현식입니다. 이 코드는 매 실행마다 배열의 크기를 계산하기 때문에 느려집니다. 크기는 변하지 않기 때문에, 크기를 저장하는 중간 변수를 사용하여 루프를 돌리도록 최적화 할 수 있습니다. 아래 예제가 보여줍니다:

 

<?php
$people = Array(
        Array('name' => 'Kalle', 'salt' => 856412),
        Array('name' => 'Pierre', 'salt' => 215863),
        );
 
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
    $people$i'salt' = rand(000000, 999999);
}
?>

 

editforeach

 

(PHP 4, PHP 5, PHP 7)

The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and objects, and will issue an error when you try to use it on a variable with a different data type or an uninitialized variable. There are two syntaxes:

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

The first form loops over the array given by array_expression. On each iteration, the value of the current element is assigned to $value and the internal array pointer is advanced by one (so on the next iteration, you'll be looking at the next element).

 

The second form will additionally assign the current element's key to the $key variable on each iteration.

 

It is possible to customize object iteration.

 

Note:

In PHP 5, when foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop.

As foreach relies on the internal array pointer in PHP 5, changing it within the loop may lead to unexpected behavior.

In PHP 7, foreach does not use the internal array pointer.

In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned byreference.

 

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>

 

Warning

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset(). Otherwise you will experience the following behavior:

 

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)

// without an unset($value), $value is still a reference to the last item: $arr3

foreach ($arr as $key => $value) {
    // $arr3 will be updated with each value from $arr...
    echo "{$key} => {$value} ";
    print_r($arr);
}
// ...until ultimately the second-to-last value is copied onto the last value

// output:
// 0 => 2 Array ( 0 => 2, 1 => 4, 2 => 6, 3 => 2 )
// 1 => 4 Array ( 0 => 2, 1 => 4, 2 => 6, 3 => 4 )
// 2 => 6 Array ( 0 => 2, 1 => 4, 2 => 6, 3 => 6 )
// 3 => 6 Array ( 0 => 2, 1 => 4, 2 => 6, 3 => 6 )
?>

 

Before PHP 5.5.0, referencing $value is only possible if the iterated array can be referenced (i.e. if it is a variable). The following code works only as of PHP 5.5.0:

 

<?php
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
?>

 

 

Note:

foreach does not support the ability to suppress error messages using '@'.

You may have noticed that the following are functionally identical:

 

<?php
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
    echo "Value: $value<br />\n";
}

foreach ($arr as $value) {
    echo "Value: $value<br />\n";
}
?>

 

The following are also functionally identical:

 

<?php
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
    echo "Key: $key; Value: $value<br />\n";
}

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}
?>

 

 

Some more examples to demonstrate usage:

 

<?php
/* foreach example 1: value only */

$a = array(1, 2, 3, 17);

foreach ($a as $v) {
    echo "Current value of \$a: $v.\n";
}

/* foreach example 2: value (with its manual access notation printed for illustration) */

$a = array(1, 2, 3, 17);

$i = 0; /* for illustrative purposes only */

foreach ($a as $v) {
    echo "\$a$i => $v.\n";
    $i++;
}

/* foreach example 3: key and value */

$a = array(
    "one" => 1,
    "two" => 2,
    "three" => 3,
    "seventeen" => 17
);

foreach ($a as $k => $v) {
    echo "\$a$k => $v.\n";
}

/* foreach example 4: multi-dimensional arrays */
$a = array();
$a00 = "a";
$a01 = "b";
$a10 = "y";
$a11 = "z";

foreach ($a as $v1) {
    foreach ($v1 as $v2) {
        echo "$v2\n";
    }
}

/* foreach example 5: dynamic arrays */

foreach (array(1, 2, 3, 4, 5) as $v) {
    echo "$v\n";
}
?>

 

editUnpacking nested arrays with list()

(PHP 5 >= 5.5.0, PHP 7)

PHP 5.5 added the ability to iterate over an array of arrays and unpack the nested array into loop variables by providing a list() as the value.

For example:

<?php
$array = 
    [1, 2,
    3, 4,
];

foreach ($array as list($a, $b)) {
    // $a contains the first element of the nested array,
    // and $b contains the second element.
    echo "A: $a; B: $b\n";
}
?>

 

위 예제의 출력:

A: 1; B: 2
A: 3; B: 4

You can provide fewer elements in the list() than there are in the nested array, in which case the leftover array values will be ignored:

 

<?php
$array = 
    [1, 2,
    3, 4,
];

foreach ($array as list($a)) {
    // Note that there is no $b here.
    echo "$a\n";
}
?>

 

위 예제의 출력:

1
3

A notice will be generated if there aren't enough array elements to fill the list():

 

<?php
$array = 
    [1, 2,
    3, 4,
];

foreach ($array as list($a, $b, $c)) {
    echo "A: $a; B: $b; C: $c\n";
}
?>

 

위 예제의 출력:

Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C: 

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C: 

 

edit변경점

 

버전 설명
7.0.0 foreach does not use the internal array pointer anymore.
5.5.0 Referencing of $value is supported for expressions. Formerly, only variables have been supported.
5.5.0 Unpacking nested arrays with list() is supported.

editbreak

 

break는 현재 forforeachwhiledo-while 또는 switch절의 수행을 멈춘다.

break는 숫자 인수 옵션을 허용함으로써 내포된 구문구조의 깊이를 표시하고 거기서 빠져나올수 있게 해준다.

 

<?php
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each ($arr)) {
    if ($val == 'stop') {
        break;    /* 여기서는 'break 1;'으로 슬 수 있습니다. */
    }
    echo "$val<br />\n";
}

/* 옵션 인수 사용하기. */

$i = 0;
while (++$i) {
    switch ($i) {
    case 5:
        echo "At 5<br />\n";
        break 1;  /* switch만 빠져나갑니다. */
    case 10:
        echo "At 10; quitting<br />\n";
        break 2;  /* switch와 while을 빠져나갑니다. */
    default:
        break;
    }
}
?>

 

editcontinue

 

continue는 루프 구조 내부에서 현재 루프 반복의 나머지 부분을 생략하고 조건 평가를 한 후 다음 반복 시작에서 실행을 지속하게 합니다.

 

Note: PHP에서 switch구문은 continue에 의해 루프 구조로 사용할수 있다는것을 참고할것.

 

continue는 숫자 인수 옵션을 사용하여 루프의 깊이를 표시할수 있고, 루프의 끝까지 건너뛸수 있다.

 

<?php
while (list($key, $value) = each($arr)) {
    if (!($key % 2)) { // skip odd members
        continue;
    }
    do_something_odd($value);
}

$i = 0;
while ($i++ < 5) {
    echo "Outer<br />\n";
    while (1) {
        echo "  Middle<br />\n";
        while (1) {
            echo "  Inner<br/ >\n";
            continue 3;
        }
        echo "This never gets output.<br />\n";
    }
    echo "Neither does this.<br />\n";
}
?>

 

continue 뒤의 세미콜론을 빼먹으면 혼란스러울 것입니다. 여기에 해서는 안되는 일의 예제입니다:

 

<?php
  for ($i = 0; $i < 5; ++$i) {
      if ($i == 2)
          continue
      print "$i\n";
  }
?>

 

기대했던 결과는:

 

0
1
3
4

 

하지만 스크립트의 출력은:

 

2

 

print 호출의 반환값은 int(1)이기 때문에, 위에서 언급한 선택적인 수 인수로 간주합니다.

editswitch

 

switch구문은 연속적인 같은 표현식을 갖는 연속적인 IF구문과 비슷하다. 많은 경우, 하나의 변수(또는 표현식)으로 다른 많은 값과 비교할 필요가 있으며, 그 값이 동일한 코드의 파편들을 수행할 필요가 생기게 된다. 정확히 이런 목적을 위해 switch구문이 사용된다.

 

Note

다른 언어와는 달리 continue문은 switch문에서 사용할수 있고, break문과 비슷하게 동작한다. 루프 내에 switch문을 포함하고 있고 바깥 루프의 다음 반복문으로 진행하고 싶다면 continue 2를 사용한다.

 

Note:

switch/case는 느슨한 비교를 하는 점에 주의하십시오.

 

다음 예제 코드들은 같은 일을 서로 다르게 표현한 것입니다. 하나는 if와 elseif문을 사용한 것이고, 다른 하나는 switch문을 사용했습니다:

 

Example #1 switch 구조

 

<?php
if ($i == 0) {
    echo "i는 0";
} elseif ($i == 1) {
    echo "i는 1";
} elseif ($i == 2) {
    echo "i는 2";
}

switch ($i) {
case 0:
    echo "i는 0";
    break;
case 1:
    echo "i는 1";
    break;
case 2:
    echo "i는 2";
    break;
}
?>

 

Example #2 문자열을 사용하는 switch 구조

 

<?php
switch ($i) {
case "apple":
    echo "i는 apple";
    break;
case "bar"
    echo "i는 bar";
    break;
case "cake":
    echo "i는 cake";
    break;
}
?>

 

실수하지 않기 위해 switch문이 어떻게 동작하는지 이해할 필요가 있다. switch문은 한줄씩 수행된다 (실제는, 한구문씩). 처음에는 아무 코드도 수행되지 않는다. switch 표현의 값과 일치하는 값을 가진 case 구문을 발견했을 때, PHP는 그 구분을 실행합니다. PHP는 switch블록의 끝부분이 될때까지, 또는 break문와 첫번째 조우를 할때까지 구문을 계속 수행해 간다. 만약 각 case 구문 목록의 끝부분에 break문을 쓰지않는다면 PHP는 다음 case문으로 계속 진행하게 된다. 예를 들면 다음과 같다:

 

<?php
switch ($i) {
case 0:
    echo "i는 0과 같다";
case 1:
    echo "i는 1과 같다";
case 2:
    echo "i는 2와 같다";
}
?>

 

여기에서, $i가 0이라면, PHP는 모든 echo문을 실행합니다! $i가 1이라면, PHP는 마지막 두 echo문을 실행합니다. $i가 2일 때만, 원하는 동작('i는 2와 같다' 표시)을 합니다. 따라서, break을 잊어서는 안됩니다. (어떤 경우에는 일부러 빠트릴 수 있어도, 잊지 마십시오)

switch구문에서, 조건문은 오직 한번만 평가되고 각 case문에서 결과가 비교되어진다. elseif문에서는 조건문은 다시 평가된다. 조건문이 한번 이상의 비교가 필요한 복잡한 것이거나 거친(tight) 루프안에 있다면 switch문 좀 더 빠를것이다.

case에 대한 구문 목록은 비어있을수 있다. 이것은 단순히 다음 case문으로 제어권을 넘겨줄 뿐이다.

 

<?php
switch ($i) {
case 0:
case 1:
case 2:
    echo "i는 3보다 작지만 음수는 아닙니다.";
    break;
case 3:
    echo "i는 3";
}
?>

 

특별한 case가 바로 default case문이다. 이것은 다른 case문과 모두 조건이 맞지 않을때의 경우를 위한 것입니다. 예를 들면:

<?php
switch ($i) {
case 0:
    echo "i는 0과 같다";
    break;
case 1:
    echo "i는 1과 같다";
    break;
case 2:
    echo "i는 2와 같다";
    break;
default:
    echo "i는 0, 1, 2 어느것도 아니다";
}
?>

 

case의 표현식은 정수나 부동소수점 수와 문자열같은 단순형으로 평가되는 어던 표현식도 될수 있다. 여기에 단순형으로 재참조(dereference)되지 않는 배열이나 객체를 사용할수는 없다.

switch문을 위한 제어 구조의 대체 문법이 지원된다. 더 자세한 정보는 제어 구조의 대체 문법을 참고.

 

<?php
switch ($i):
case 0:
    echo "i equals 0";
    break;
case 1:
    echo "i equals 1";
    break;
case 2:
    echo "i equals 2";
    break;
default:
    echo "i is not equal to 0, 1 or 2";
endswitch;
?>

 

case 뒤에 세미콜론 대신 콜론을 쓸 수 있습니다:

 

<?php
switch($beer)
{
    case 'tuborg';
    case 'carlsberg';
    case 'heineken';
        echo 'Good choice';
    break;
    default;
        echo 'Please make a new selection...';
    break;
}
?>

 

 

editdeclare

 

 

declare구문은 코드 블록의 수행 지시어를 활성화하기 위해 사용된다. declare문법은 다른 흐름 제어 구조의 문법과 비슷하다:

declare (directive) statement

directive 부분은 declare 블록의 동작을 활성화합니다. 현재는 두 지시어만 인식합니다: ticks 지시어(자세한 정보는 아래 ticks 지시어 참고)와encoding 지시어(자세한 정보는 아래 encoding 지시어 참고).

 

Note: encoding 지시어는 PHP 5.3.0에서 추가되었습니다.

declare블록의 statement부분이 수행될것이다 - 어떻게 수행이 되고 수행중에 어떤 사이드 이펙트가 발생할지는 directive블록의 디렉티브에 달려있다.

 

declare 구문은 전역 유효영역 안에서 사용할수 있다. 그래서 모든 코드가 그 디렉티브에 영향을 받는다. (그러나 declare가 있는 파일을 포함하였을 때에는 원 파일에는 영향을 주지 않습니다)

<?php
// 이들은 동일합니다:

// 이를 사용할 수 있습니다:
declare(ticks=1) {
    // 여기에 전체 스크립트
}

// 또는 이렇게 사용할 수 있습니다:
declare(ticks=1);
// 여기에 전체 스크립트
?>

 

 

 ¶" id="_5">edit틱(Ticks) ¶

Caution

PHP 5.3.0부터 틱은 배제되었고, PHP 6.0.0에서 제거될 예정입니다.

틱은 declare블록에서 파서에 의해 수행되는 N 저레벨(low-level) 구문마다 발생하는 이벤트이다. N 값은 declare블록의 directive부분에서ticks=N 으로 지정할수 있다.

 

각 틱에서 발생하는 이벤트(들)은 register_tick_function()함수 를 써서 지정한다. 자세한 것은 아래 예제를 볼것. 각 틱에서는 하나 이상의 이벤트가 발생할수 있음에 주의해야 한다.

 

Example #1 PHP 각 코드 섹션의 분석표만들기(Profile)

 

 

<?php
// 호출될대의 시간을 기록하는 함수
function profile($dump = FALSE)
{
    static $profile;

    // Profile에 저장된 모든 시간 리턴하고, 삭제함
    if ($dump) {
        $temp = $profile;
        unset($profile);
        return $temp;
    }

    $profile[] = microtime();
}

// 틱 핸들러 설정
register_tick_function("profile");

// declare 블록 전에 함수를 초기화
profile();

// 코드 블록의 실행하고, 두번째 구문에 틱을 부여함
declare(ticks=2) {
    for ($x = 1; $x < 50; ++$x) {
        echo similar_text(md5($x), md5($x*$x)), "<br />;";
    }
}

// 분석표에 저장된 데이터를 출력
print_r(profile(TRUE));
?>

 

위 예제 코드는 실행 블록안의 두번째 저레벨(low-level) 구문의 시간에 따라 'declare'블록 안의 PHP코드를 분석한다. 이런 정보로 어느 코드 부분에서 느려지는지 알아볼 수 있다. 이런 처리방법은 다른 기법으로 수행할수있다: 틱을 이용하는 것은 좀더 편하고 좀더 구현하기 쉽다.

 

틱은 디버깅, 단순한 멀티태스킹 구현, 백그라운드 I/O와 다른 많은 작업 에 적합하게 이용할수 있다.

 

register_tick_function()함수와 unregister_tick_function()함수를 참고하세요.

 

 ¶" id="_6">edit인코딩 ¶

encoding 지시어를 사용하여 스크립트 별로 지정할 수 있는 인코딩입니다.

 

Example #2 스크립트의 인코딩 선언하기

<?php
declare(encoding='ISO-8859-1');
// code here

 

Caution

이름공간과 결합할 때, declare의 적합한 문법은 declare(encoding='...'); 뿐입니다. (...은 인코딩 값) 이름공간과 결합했을 때,declare(encoding='...') {}은 해석 오류를 발생합니다.

 

PHP 5.3에서는 PHP가 --enable-zend-multibyte로 컴파일 되지 않았을 경우, encoding 선언 값이 무시됩니다. PHP 6.0에서는, encoding 지시어가 파일이 생성된 인코딩을 스캐너에게 알려줍니다. 적절한 값은 UTF-8 등의 인코딩 이름입니다.

editreturn

 

return문이 함수안에서 호출된다면, 현재 함수의 수행을 즉시 끝내고, 함수 호출 결과값으로 return의 인수값을 넘겨준다. return문은 eval()함수나 스크립트 파일의 수행을 종료시킨다.

전역 유효범위에서 호출된다면, 현재 스크립트 파일의 수행을 끝마친다. 현재 스크립트가 include나 require되었다면, 호출하고 있는 파일로 제어를 넘긴다. 더욱이, 현재 스크립트 파일이 include되어있는것이면, return에 주어지는 값은 include호출에 대한 값으로 넘겨줄것이다. return이 주 스크립트 파일에서 호출되면, 스크립트의 수행이 종료된다. 현재 스크립트 파일이 php.ini의 auto_prepend_file이나 auto_append_file 옵션에 의해 명명되었다면, 스크립트 파일의 수행은 중단된다.

 

좀더 자세한 정보는 Returning values 을 참고하세요.

 

Note

return은 함수가 아닌 언어 구조이기 때문에, 인수를 괄호로 쌀 필요가 없습니다. 괄호가 없는 것이 일반적으로, PHP가 더 적은 일을 하게 합니다.

 

Note

반환값이 참조로 반환될 때는 절대로 괄호를 사용하면 안되며, 동작하지 않습니다. 참조는 변수만 반환할 수 있으며, 구문 결과는 반환할 수 없습니다. return ($a);를 사용한다면, 변수를 반환하지 않고 ($a) 표현의 반환값을 반환합니다. (물론, $a의 값입니다)

editrequire

 

require는 실패시에 치명적인 E_ERROR 등급 오류가 발생한다는 점을 제외하면, include와 동일합니다. 즉, include가 경고(E_WARNING)만 발생하고 스크립트는 계속 진행되는 것과 달리, 스크립트가 중단됩니다.

 

작동에 관해서는 include 문서를 참고하십시오.

editinclude

 

include문은 특정 파일을 인클루드 하고, 적용시킨다.

 

아래 내용은 require에도 적용됩니다. 두 구조는 수행 실패를 다루는 방법을 제외하고 완전히 동일합니다. 둘 모두 Warning을 발생시키지만, require는 Fatal Error가 나타납니다. 즉, 파일이 없을 때 페이지 처리를 멈추고 싶으면 require를 사용하면 됩니다. include는 멈추지 않고 스크립트가 계속 실행됩니다. 또한, 적합한 include_path 설정인지 확인해야 합니다. PHP 4.3.5 이전에는 포함한 파일 안에서 해석 오류가 발생해도 수행을 멈추지 않는 점에 주의하십시오. 이 버전부터는 멈춥니다.

파일을 포함할 때는 각 include_path에 대해서 먼저 현재 작업 디렉토리에서 상대 경로를 찾고, 실행중인 스크립트가 있는 디렉토리를 찾습니다. 즉, include_path가 libraries이고, 현재 작업 디렉토리가 /www/이며, 포함한 파일 include/a.php에 include "b.php"가 있으면, b.php는 먼저 /www/libraries/에서 찾고, 그 후에 /www/include/을 찾습니다. 파일 이름이 ./이나 ../로 시작하면, 현재 작업 디렉토리 안에서만 찾습니다.

파일이 인클루드 되면, 그 코드를 포함하는 코드는 인클루드가 발생한 줄의 변수 유효 범위를 물려받는다. 호출하는 파일의 그 줄에서 사용되는 어떤 변수도 그 줄부터는 호출된 파일안에서 사용이 가능하다. 그러나, 포함한 파일에서 선언한 모든 함수와 클래스는 전역 영역에 들어갑니다.

 

Example #1 기본적인 include 사용예

 

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

 

인클루드가 호출하는 파일안의 함수내에서 발생한다면, 호출된 파일안의 모든 코드가 그 함수에서 정의된것처럼 동작한다. 그래서, 그 함수의 변수 유효범위를 따를것이다. 이 규칙의 에외는 포함이 일어나기 전에 평가되는 마법 상수입니다.

 

Example #2 함수 내에서 인클루드하기

 

<?php

function foo()
{
    global $color;

    include 'vars.php';

    echo "A $color $fruit";
}

/* vars.php is in the scope of foo() so     *
 * $fruit is NOT available outside of this  *
 * scope.  $color is because we declared it *
 * as global.                               */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

 

파일이 인클루드되면, 파싱은 PHP모드의 밖으로 나가서 목적 파일의 시작부분은 HTML모드로 들어가게 되고, 끝부분에서 원래대로 회복된다. 이때문에, 목적 파일에서 PHP코드로서 수행되어야 하는 코드는 유효한 PHP 시작과 마침 태그 로 막아줘야 한다.

 

PHP에서 "URL fopen wrappers"가 활성화되어 있으면 (디폴트 설정임), URL(HTTP나 다른 지원 래퍼(wrapper) - 프로토콜 목록은 Supported Protocols and Wrappers을 참고)을 사용하여 파일을 인클루드 할수 있다. 목적 서버가 목적 파일을 PHP코드로 해석한다면, HTTP GET으로 사용된 URL 리퀘스트 문자열은 변수로서 넘겨지게 될것이다. 이와같은 일은 파일을 인크루드 하고 부모 파일의 변수 유효범위를 상속하는 것과 같은 경우가 되지는 않는다. 스크립트는 실질적으로 원격 서버에서 실행이 되고 나서 로컬 스크립트에 포함된다.

 

Warning
PHP 4.3.0 이전의 윈도우 버전 PHP에서는 이 함수를 이용하여 원격 파일에 접근할 수 없습니다. allow_url_fopen을 활성화하여도 마찬가지입니다.

 

Example #3 HTTP로 include하기

 

<?php

/* This example assumes that www.example.com is configured to parse .php
 * files and not .txt files. Also, 'Works' here means that the variables
 * $foo and $bar are available within the included file. */

// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';

// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;
$bar = 2;
include 'file.txt';  // Works.
include 'file.php';  // Works.

?>

 

Warning
보안 경고

원격 파일은 원격 서버에서 실행(파일 확장자와 원격 서버가 PHP를 실행하는가에 따라 다릅니다)되지만, 로컬 서버에서 실행할 수 있는 유효한 PHP 스크립트를 만들 수도 있습니다. 원격 서버에서만 실행한 결과를 그대로 출력해야 한다면, readfile() 함수가 더 적합합니다. 아니라면, 원격 스크립트가 유효하고 적합한 코드를 생성하도록 특별한 주의를 기울이십시오.

 

참고: 원격 파일fopen()file()에 관련 정보가 있습니다.

 

반환 다루기: include한 파일 안에서 그 파일의 수행을 종료하고, 호출한 스크립트로 돌아가기 위해서 return문을 실행할 수 있습니다. 또한, 값을 반환하는 일도 가능합니다. include 호출을 일반 함수를 사용한 것처럼 값을 받을 수 있습니다. 그러나, 원격 파일을 포함하였을 때, 그 파일의 출력이 (다른 로컬 파일처럼) 유효한 PHP 시작과 끝 태그를 가지지 않는다면 이 값을 받을 수 없습니다. 이 태그들 안에 필요한 값을 정의하면, include한 파일의 어떤 위치에서라도 사용할 수 있습니다.

 

include은 특별한 언어 구조이기 때문에, 인수를 괄호로 쌀 필요가 없습니다. 반환값을 비교할 때는 조심하십시오.

 

Example #4 include의 반환값 비교하기

 

<?php
// include(('vars.php') == 'OK'), 즉 include('')로 인식하여 작동하지 않습니다.
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// 작동합니다.
if ((include 'vars.php') == 'OK') {
    echo 'OK';
}
?>

 

Example #5 include와 return

 

return.php
<?php

$var = 'PHP';

return $var;

?>

noreturn.php
<?php

$var = 'PHP';

?>

testreturns.php
<?php

$foo = include 'return.php';

echo $foo; // prints 'PHP'

$bar = include 'noreturn.php';

echo $bar; // prints 1

?>

 

include가 성공했기 때문에 $bar의 값은 1입니다. 위 예제 사이의 차이에 주목하십시오. 처음 것은 포함한 파일 안에서 return을 사용하였지만, 다른 것은 하지 않았습니다. 파일을 포함할 수 없으면 FALSE를 반환하고 E_WARNING을 발생합니다.

 

포함한 파일에서 함수를 정의하면, 어디서 return을 했는지에 관계 없이 메인 파일에서 사용할 수 있습니다. 파일이 두번 포함되면, PHP 5는 함수가 이미 정의되어 있기 때문에 치명적인 오류를 발생하지만, PHP 4는 return 뒤에 정의했다면 불평하지 않습니다. 이미 포함한 파일을 확인하기 위해서는 포함한 파일 안에서 조건적으로 return하기 보다는 include_once를 사용하는 것을 권합니다.

 

PHP 파일을 변수로 "포함"하는 또 다른 방법은 출력 제어 함수를 include와 함께 사용하여 출력을 캡쳐하는 것입니다. 예를 들면:

 

Example #6 PHP 파일을 포함하여 문자열로 변환하기 위해 출력 버퍼링 사용하기

 

 

<?php
$string = get_include_contents('somefile.php');

function get_include_constents($filename) {
    if (is_file($filename)) {
        ob_start();
        include $filename;
        $contents = ob_get_contents();
        ob_end_clean();
        return $contents;
    }
    return false;
}

?>

 

 

스크립트 안에 자동으로 파일을 포함하기 위해서는, php.ini의 auto_prepend_file과 auto_append_file 설정 옵션을 참고하십시오.

 

Note: 이것은 함수가 아닌 언어 구조이기 때문에, 가변 함수 방식으로 호출할 수 없습니다.

참고: requirerequire_onceinclude_onceget_included_files()readfile()virtual()virtual()include_path.

editrequire_once

 

require_once 구문은 PHP가 파일을 이미 포함하였는지 확인하여 다시 include(require)하지 않는 점을 제외하면, require와 동일합니다.

 

_once 동작에 대한 정보와, _once 없는 것과 어떻게 다른가에 대해서는 include_once 문서를 참고하십시오.

editinclude_once

 

include_once문은 스크립트 수행기간동안 특정파일을 인클루드하고 적용시킨다. 이것은 include문과 비슷하게 동작한다. 단지 파일의 특정 코드가 이미 인클루되었다면 그 코드는 다시는 인클루드 될수 없다는 차이점만 있다. 이 이름이 제시하듯이 한번만 인클루드할것이다.

 

include_once는 특정 스크립트 수행기간동안 동일한 파일이 한번 이상 인클루드되고 적용될지도 모르는 상황에서 사용해야 할것이다. 그리고 함수 중복정의, 변수값 중복 지정 등의 문제를 회피하려면 정확히 한번만 인클루드할 때가 있을것이다.

 

require_once와 include_once의 더 많은 사용예는, 최신 PHP 소스 내의 » PEAR코드를 참고할것.

 

반환값은 include와 동일합니다. 파일이 이미 포함되었으면, TRUE를 반환합니다.

 

 

Note:

include_once는 PHP 4.0.1에서 추가됨

 

Note:

include_once와 require_once는 대소문자를 구별하지 않는 운영체제(윈도우 등)에서 기대하지 않은 동작을 할 수 있습니다.

 

Example #1 include_once는 윈도우에서 대소문자를 구분하지 못합니다.

 

<?php
include_once "a.php"; // a.php를 포함합니다.
include_once "A.php"; // 윈도우에서 또다시 a.php를 포함합니다. (PHP 4만)
?>

 

이 동작은 PHP 5에서 바뀌었습니다 - 경로를 표준화를 먼저 하기 때문에, C:\PROGRA~1\A.php를 C:\Program Files\a.php로 인식하고, 파일을 한 번만 포함합니다.

Warning

PHP 4.3.0 이전의 윈도우 버전 PHP에서는 이 함수를 이용하여 원격 파일에 접근할 수 없습니다. allow_url_fopen을 활성화하여도 마찬가지입니다.

 

참고: includerequirerequire_onceget_required_files()get_included_files()readfile()virtual().

 

editgoto

 

 

The goto operator can be used to jump to another section in the program. The target point is specified by a label followed by a colon, and the instruction is given as goto followed by the desired target label. This is not a full unrestricted goto. The target label must be within the same file and context, meaning that you cannot jump out of a function or method, nor can you jump into one. You also cannot jump into any sort of loop or switch structure. You may jump out of these, and a common use is to use a goto in place of a multi-level break.

 

Example #1 goto example

 

<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>

 

위 예제의 출력:

Bar

 

Example #2 goto loop example

<?php
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
?>

 

위 예제의 출력:

j hit 17

 

Example #3 This will not work

 

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

 

위 예제의 출력:

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

 

Note:

The goto operator is available as of PHP 5.3.

태그
엮인글 :
https://4880.net/wiki_php/182099/6b1/trackback
공헌자 :
부운영자
사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )

사이트연락처

  • 이용약관
    개인정보 취급방침
  • [문자가능] 070-7797-4480
  • 디스코드/스카이프ID : [admin@4880.net]
    카카오플러스 / 카카오플러스채팅
    Loading the player ...
서버에 요청 중입니다. 잠시만 기다려 주십시오...