PHP의 함수 (정의, 반환, 참조, 포함과 요구)
PHP의 함수 (정의, 반환, 참조, 포함과 요구)
모든 프로그래밍 언어의 기본 요구사항에는 데이터를 저장하는 공간과 프로그램 흐름을 제어하는 수단, 표현식 검증, 파일 관리, 텍스트 출력 등이 포함된다.
하지만 프로그래밍을 하다보면, 반복적으로 발생하는 부분이 있다.
이렇게 반복하는 부분에 함수가 사용된다. 반복되는 코드를 떼어내서 함수에 넣고, 그 코드가 필요할 때 함수의 이름을 호출한다. 그러면 함수를 값을 반환한다.
1. 함수의 장점
함수는 인접한 인라인코드보다도 장점이 많다.
- 타자를 적게 쳐도 된다.
- 함수는 문법 사용과 프로그래밍 오류를 줄인다.
- 프로그램 파일의 로딩 시간을 단축시킨다.
- 각 함수는 얼마나 자주 불리든 관계없이 오직 한 번만 컴파일되기 때문에 실행 시간이 단축된다.
- 함수는 인수를 받기 때문에 일반적인 경우와 특별한 경우에 모두 사용할 수 있다.
2. PHP 함수
PHP는 수백 개의 미리 생성된 내장 함수가 있다. 함수를 사용하려면 함수의 이름으로 호출하면 된다.
그 중 phpinfo(); 함수는 현재 PHP 설치에 관한 정보를 보여준다. PHP의 버전 및 지원 기능 설치 서버 등의 정보를 볼 수 있지만, 해커에게도 유용한 정보이기에, 사용자에게 노출되지 않도록 주의한다.
<?php phpinfo(); // PHP 설치 정보를 불러온다. ?> |
함수 실행 정보
3. 함수 정의
함수 정의의 일반적인 문법은 다음과 같다.
- 정의는 function으로 시작한다.
- 다음으로 문자나 밑줄로 시작해서 개수에상관없이 문자나 숫자, 밑줄을 사용할 수 있는 함수 이름이 나온다.
- 괄호가 요구된다.
- 선택적으로 하나 이상의 매개 변수가 요구된다.
함수 이름은 대소문자를 구분하지 않는다.
<?php function function_name([parameter[,...].]){ // 로직 } ?> |
4. 반환
함수를 실행시키면 반환값을 기대한다. 반환값은 변수가 될 수 있고 배열이 될 수도 있다.
반환은 return 을 사용한다.
<?php function fix_name($n1, $n2, $n3){ $n1 = ucfirst(strtolower($n1)); // $n1의 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 $n2 = ucfirst(strtolower($n2)); // $n2의 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 $n3 = ucfirst(strtolower($n3)); // $n3의 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 return $n1 . " " .$n2. " " . $n3; // $n1 $n2 $n3 값 반환 } function fix_name2($n1, $n2, $n3){ $n1 = ucfirst(strtolower($n1)); // $n1의 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 $n2 = ucfirst(strtolower($n2)); // $n2의 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 $n3 = ucfirst(strtolower($n3)); // $n3의 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 return array($n1, $n2, $n3); // $n1 $n2 $n3 배열로 반환 } ?> |
fix_name 함수는 3개의 값을 하나의 값으로 반환한다. fix_name2는 각각의 변수를 분리하여 배열로 반환한다.
5. 참조
PHP에서 변수의 앞에 붙은 & 은 파서에게 값 자체가 아닌 변수 값의 참조를 말한다.
참조란 그 변수를 가르키는 주소값이다. 참조 변수는 함수에서 인자를 넘길 때, 직접 변수를 수정할 때 사용한다.
함수에 넘어온 인자들은 함수 안에서 새로운 변수를 처리하기 위해 복사본을 만들고 함수 안에서 처리 후 값을 반환하고 사라진다. 따라서 인자들의 복사본을 만들기 위한 오버헤드가 발생한다. 하지만 인자로 참조값을 넘기면, 복사본을 만들지 않고 변수에 직접 접근하여, 함수 내에서 직접 수정할 수 있다. 하지만 직접 변수를 수정하기에 원래 값을 유지하기 위해서는 주의해야 한다.
<?php $a1 = "WILLIAM"; $a2 = "henry"; $ac = "gatES"; echo $a1 ." " . $a2. " ". $a3 . "<br/>"; // WILLIAM henry gatES 출력 fix_name($a1, $a2, $a3); // fix_name() 실행 $a1, $a2, $a3 의 값을 변경한다. echo $a1 . " " . $a2. " ". $a3; // William Henry Gates 출력 function fix_name(&$n1, &$n2, &$n3){ // 3개의 인자의 참조값을 가져온다. $n1 = ucfirst(strtolower($n1)); // $n1 인자의 본래 변수인 $a1의 // 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 $n2 = ucfirst(strtolower($n2)); // $n2 인자의 본래 변수인 $a2의 // 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 $n3 = ucfirst(strtolower($n3)); // $n3 인자의 본래 변수인 $a3의 // 문자를 전부 소문자로 바꾼 후 첫 번째 문자를 대분자로 변경 } ?> |
6. 포함과 요구
프로그래밍을 하다보면, 계속적으로 사용할 함수를 라이브러리로 만들어서 사용하게 된다. 다른 파일의 함수를 계속 사용하기 위해서는 해당 파일을 포함(include) 또는 요구(require)를 사용한다.
포함(include)
include를 사용하면 PHP에게 특정 파일을 가져와서 모든 내용을 로드하게 된다. 마치 include 된 파일을 현재 파일의 include 위치에 붙여 넣는 것과 같다.
<?php include "library.php"; // library.php 파일 포함 ?> |
include_once
include 명령을 내릴 때마다 요구한 파일을 이미 불러 왔더라도 다시 포함한다. 중복으로 같은 파일을 포함하면, 한 파일에 같은 이름의 변수 및 함수가 정의되어 오류가 발생한다. 이 문제를 피하기 위해서 include_once를 사용한다.
include_once 를 정의하면, 해당파일을 다른 include 나 include_once 로 정의된 부분을 만나면 무시한다.
따라서 include 보다 include_once를 사용하는게 좋다.
<?php include_once "library.php"; // library.php 파일 포함 include "library.php" // 중복 포함으로 무시 ?> |
요구(require) 와 require_once
include와 include_once의 문제점은 파일이 없더라도 프로그램 실행이 계속된다.
파일이 절대적으로 필요할 경우에는 require를 사용한다.
require_once 역시 include_once와 마찬가지로 중복으로 발생할 수 있는 에러를 제거한다.
<?php require_once "library.php"; // library.php 파일 포함 파일이 없을 경우 에러 발생 // 중복 포함 무시 require "library.php" // 중복 포함으로 무시 ?> |
출처: https://hyeonstorage.tistory.com/105?category=549768 [개발이 하고 싶어요]
'PHP > php' 카테고리의 다른 글
[PHP][TIP] exec 혹은 shell_exec 비동기로 처리하기 (0) | 2021.01.06 |
---|---|
[PHP][TIP] http 302 (redirect) 일 때 curl 사용하기 (0) | 2021.01.06 |
PHP의 객체 (2/2) (메소드, 속성, 상수, 메소드 범위, 상속) (0) | 2019.07.25 |
PHP의 객체 (1/2) (클래스 정의, 객체 생성, 접근, 생성자, 소멸자) (0) | 2019.07.25 |
PHP의 반복문 (for, while, do while, break, continue) (0) | 2019.07.25 |
PHP의 조건문 (if, switch, ? 연산자) (0) | 2019.07.25 |
PHP 시작 (2/2) - 알아두면 좋은 몇가지 (0) | 2019.07.25 |
PHP 시작 (1/2) - 이것만은 알고 시작하자. (0) | 2019.07.25 |