외부 파일 포함시키기
require(), include()
// hello.php <?php echo 'Hello World!<br />'; ?> // main.php <?php echo 'Start.<br />'; require('hello.php'); echo 'End.<br />'; ?>
- require() : 실패시 치명적 오류 발생
- include() : 실패시 가벼운 경고
외부 파일을 PHP 스크립트 내부에 포함시킬 수 있는데, require()와 include()를 사용하며 그 기능은 거의 동일하다. 만약 파일을 불러오는 과정에서 실패했을 경우 오류를 처리하는 과정에서 조금 차이가 날 뿐이다. 불러올 수 있는 파일은 PHP, HTML, 일반 문장 등 뭐든지 크게 상관 없다.
auto_prepend_file, auto_append_file
만약 특별한 입력없이 모든 페이지에 특정 파일을 include시키고 싶다면 php.ini 파일에 설정 옵션 중 auto_prepend_file과 auto_append_file을 사용하는 방법이 있다. 아래와 같이 입력하여 사용한다.
- auto_prepend_file = "문서경로.php" : 문서의 앞부분에 include 한다.
- auto_append_file = "문서경로.php" : 문서의 뒷부분에 include 한다.
PHP에서 함수 사용하기
함수도 상당 부분 타 언어들과 비슷한 부분이 많다. 설명은 최소한으로 하고 주로 예제를 통해 확인하는 방법으로 강의를 진행하겠다.
대소문자와 함수 이름
많은 다른 프로그래밍 언어와 다르게 PHP에서는 함수이름에 대소문자를 구별하지 않는다. 즉 function_name(), Function_Name(), FUNCTION_NAME() 등은 모두 같은 함수를 호출한다. 한편 변수의 이름은 함수의 이름과 달리 대소문자를 구별한다. 헷갈리지 않도록 하자.
사용자 정의 함수
함수의 기본 구조
// 선언 <?php function my_function() { echo 'My function was called'; } ?> // 호출 <?php my_function(); ?>
위와 같이 함수를 한번 선언하면 함수의 이름을 통해 호출할 수 있다. 이 때, 함수의 선언의 위치는 중요하지 않다.
함수 이름 붙이기
함수의 이름은 함수의 기능을 충분히 설명할 수 있도록 짓는 것이 좋다. 단 함수 이름을 지을 때 몇 가지 제약사항이 있다.
- 함수는 다른 함수와 같은 이름을 쓸 수 없다.
- 함수 이름은 문자와 숫자, '_' 만을 사용할 수 있다.
- 함수는 숫자로 시작할 수 없다.
함수이름으로 $name이라는 것은 위에서 설명한 제약사항에 따라 적절치 않지만 때때로 실행 가능한 형태일 수도 있다. 만약 my_function()이라는 함수가 이미 정의되어 있고 $name='my_function';인 $name이라는 변수를 선언하고 $name();을 실행시키면 $name이라는 값이 my_function이기 때문에 my_function함수가 호출된다.
파라미터
<?php function my_function($a, $b=10, $c=100) { echo "$a, $b, $c"; } ?> <?php my_function(1); // 1, 10, 100 출력 my_function(1, 2); // 1, 2, 100 출력 my_function(1, 2, 3); // 1, 2, 3 출력 ?>
위 예제처럼 함수에 파라미터를 정의하고 함수를 호출할 때 파라미터를 넘겨줄 수 있다. 이 때 파라미터에 기본값을 미리 정의해서 사용할 수도 있다.
파라미터와 관련된 함수들도 있다. 아래 예제를 보자.
<?php function var_args() { echo "Number of parameters."; echo func_num_args(); // 파라미터 개수 출력 echo "<br />"; $args = func_get_args(); // 파라미터의 배열을 반환 foreach($args as $a) { echo $a."<br />"; } $arg = func_get_arg(0); // 0번째 파라미터만 반환 echo $arg."<br />"; }
- func_num_args() : 파라미터의 개수를 반환한다.
- func_get_args() : 파라미터의 배열을 반환한다.
- func_get_arg($arg_num) : 파라미터를 하나씩 반환한다. $arg_num에 접근하고 싶은 파라미터의 번호를 넘겨주면 된다.(파라미터 번호는 0번부터 시작한다.)
값으로 전달(pass-by-value), 참조로 전달(pass-by-reference)
C언어(또는 다른 언어)를 공부해 보았다면 익숙한 내용일 것이다. 기본적인 내용을 알고 있다면 예제만 보고도 이해가 될 것이다.
// 값으로 전달(pass-by-value) <?php function increment($value, $amount=1) { $value = $value + $amount; } $value=10; increment($value); echo $value; // 10 ?> // 참조로 전달(pass-by-reference) <?php function increment(&$value, $amount=1) { $value = $value + $amount; } $value=10; increment($value); echo $value; // 11 ?>
return
- 함수를 종료할 때 단독으로 사용.
- 함수에서 결과 값을 전달할 때 값과 함께 사용.
// 1번 예 function test_return() { echo "This statement will be executed!"; return; echo "This statement will never be executed!"; } // 2번 예 function larger($x, $y) { if( (!isset($x)) || (!isset($y)) ) { return false; } else if($x>=y) { return $x; } else { return $y; } }
재귀함수
재귀함수는 자기 자신의 함수를 다시 호출하여 마치 루프처럼 사용할 수 있다. 잘 사용한다면 매우 유용할 수도 있지만 꼭 필요한 경우가 아니면 루프를 사용하는 편이 성능상 더 낫다.
function reverse($str) { // $str = 'string' if(strlen($str) > 0) { reverse(substr($str, 1)); // 'tring'을 인자로 다시 넘겨 재귀적으로 호출함 } // 'tring', 'ring', ... , 'ng', 'g'까지 모두 호출되고 나야 // 'g'부터 하나씩 빠져나와 다음 구문을 실행한다. echo substr($str, 0, 1); // 'g', 'n', 'i', ... 's' => gnirts return; }