웹 프로그래밍

[PHP] 5장 코드 재활용과 함수 작성

토픽 웹 프로그래밍 > PHP

외부 파일 포함시키기

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, 일반 문장 등 뭐든지 크게 상관 없다.

require_once()와 include_once()도 있는데 이 함수들은 파일을 단 한 번만 포함시키기 위해 사용한다. 만약 함수들의 라이브러리를 포함시킨다고 할 때에는 함수의 재선언에 의한 오류를 막을 수 있기 때문에 유용하게 사용할 수 있다. 하지만 코드 관리에 신경을 잘 쓸 수 있다면 성능 상의 이유로 쓰지 않는 편이 낫다.
함수의 라이브러리를 포함시키거나 모든 페이지에 공통되는 헤더와 푸터를 포함할 때 유용하게 사용된다.

 

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 한다.
 Apache 웹 서버를 사용한다면 각 디렉터리마다 따로 설정을 할 수도 있다.(.htaccess)

 

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. 함수를 종료할 때 단독으로 사용.
  2. 함수에서 결과 값을 전달할 때 값과 함께 사용.
// 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;
}

댓글

댓글 본문