php
PHP - 함수의 이해
함수는 모든 유효한 php코드, 즉 조건문, 클레스, 전역변수, 외부변수, 중첩, 상수 등 외부의 모든 작업을 함수 내에서 사용할 수 있도록 만들어진 코드 블록의 하나로 모듈화가 가능합니다.
모든 기능을 한 곳에서 처리하게 되면 코드를 해석하고, 관리하는 게 관리자의 입장에서 매우 어려워질 수 있습니다. 예를 들어 어떤 글을 주제별로 나누어 놓으면 읽기에 좋고, 찾기에도 쉬워 가독성이 좋아진다는 이점이 있습니다.
이렇게 기능별로 함수를 만들어 놓은 것을 모듈화라고 부르고, 더 세분화할수록 가독성은 더욱 좋아집니다.
함수는 내장함수, 외장함수, 익명함수로 분류할 수 있는데, 내장함수는 php를 설치할 때 기본적으로 제공되는 함수를 말하며, 사용자가 새로운 함수를 만들어 사용할 수도 있습니다.
참고로 함수와 메소드의 차이에 이해를 돕기 위해 클래스 내부에는 변수나 함수를 선언하거나 정의할 수 있으며 이렇게 정의된 함수를 메소드라 부릅니다. 이 메소드는 클래스의 멤버이고, 클래스 외부에 정의된 것을 함수라 부릅니다.
사용자 함수는 function 이라는 예약어로 시작하고, 하나 이상의 인자(arguments)가 올 수 있습니다.
사용자 정의 함수는 다음 세 가지 방식 중 하나를 사용하면 됩니다.
"bool"은 불형으로 true거나 false로 반환한다는 뜻입니다. "mixed"는 스칼라 값(문자열, 정수, 실수)이나 배열(Array)이 될 수 있습니다. 세번째 선택적인 인자 이름을 strict 이라 하며, 모든 선택적인 인자는 [ 브라켓 ]사이에 들어 갑니다. 매뉴얼에 strict 인자의 기본값은 bool FALSE로 나와 있습니다.
위 함수 선언을 일반적인 방법으로 다시 작성할 수 있습니다.
필요적 조건으로 타입에 대한 기본적 이해는 중요합니다. 타입은 다음 표와 같습니다.
하나 이상의 인자를 사용할 경우 쉼표로(,)로 구분해서 사용하면 되는데, 다음과 같이 작성해 줍니다.
여기서 $a, $b, $c는 인자라 하고, $arg1, $arg2, $arg3은 파라미터(parameter)라 합니다.
$arg3='bool'은 인자에 전달된 변수가 없으면, "bool"을 디폴트로 사용하겠다는 것입니다. 만약, 디폴트 값이 있으면 인자를 비워도 괜찮지만, 없으면 인자를 비워 두어서는 안됩니다.
인자에 배열이 올 수도 있고, 반환 값이 배열이 될 수도 있습니다.
반환문은 함수가 아니라 언어구조이기 때문에 괄호로 묶을 필요는 없습니다. 이는 일반적인 것으로 PHP가 더 적은 일을 하게 합니다만 괄호를 사용해도 큰 문제는 없습니다.
다음은 반환 값을 갖지 않지만, global로 대신할 수 있습니다.
모든 기능을 한 곳에서 처리하게 되면 코드를 해석하고, 관리하는 게 관리자의 입장에서 매우 어려워질 수 있습니다. 예를 들어 어떤 글을 주제별로 나누어 놓으면 읽기에 좋고, 찾기에도 쉬워 가독성이 좋아진다는 이점이 있습니다.
이렇게 기능별로 함수를 만들어 놓은 것을 모듈화라고 부르고, 더 세분화할수록 가독성은 더욱 좋아집니다.
함수는 내장함수, 외장함수, 익명함수로 분류할 수 있는데, 내장함수는 php를 설치할 때 기본적으로 제공되는 함수를 말하며, 사용자가 새로운 함수를 만들어 사용할 수도 있습니다.
이 름 | 설 명 |
---|---|
내장 함수 | PHP 에서 기본적으로 제공하는 함수 |
외장 함수 | 사용자가 만들어 사용하는 함수 |
익명 함수 | 이름을 지정하지 않은 함수 |
참고로 함수와 메소드의 차이에 이해를 돕기 위해 클래스 내부에는 변수나 함수를 선언하거나 정의할 수 있으며 이렇게 정의된 함수를 메소드라 부릅니다. 이 메소드는 클래스의 멤버이고, 클래스 외부에 정의된 것을 함수라 부릅니다.
사용자 함수는 function 이라는 예약어로 시작하고, 하나 이상의 인자(arguments)가 올 수 있습니다.
// 인자가 없는 함수라면...
function 함수이름 () { 함수내용 }
// 인자가 하나 이상 있는 함수라면...
function 함수이름 (매개변수1, 매개변수2 .... ){ 함수 내용 }
// 반환 값이 있는 함수라면 return 문이 들어갑니다.
function 함수이름 () { return arguments; }
사용자 정의 함수는 다음 세 가지 방식 중 하나를 사용하면 됩니다.
// 기본적인 방식
function 함수명 (){...}
// 익명 함수를 참조하는 방식
함수명 = function(){...}
// 함수 호출없이 바로 동작하는 방식
(function(){...})();
함수 선언(prototype)을 읽는 법
우선 함수 선언(prototype)을 읽는 법을 알아야 합니다. bool in_array ( mixed $needle, array $haystack [, bool $strict])
의미 | |||
---|---|---|---|
bool | in_array | ( mixed $needle, array $haystack [, bool $strict] ) | |
┗ 반환값 | ┗ 함수이름 | ┗ ( 인자형, $인자이름 ) |
"bool"은 불형으로 true거나 false로 반환한다는 뜻입니다. "mixed"는 스칼라 값(문자열, 정수, 실수)이나 배열(Array)이 될 수 있습니다. 세번째 선택적인 인자 이름을 strict 이라 하며, 모든 선택적인 인자는 [ 브라켓 ]사이에 들어 갑니다. 매뉴얼에 strict 인자의 기본값은 bool FALSE로 나와 있습니다.
의미 | |||
---|---|---|---|
int | strlen | ( string $string ) | |
┗ 반환값 | ┗ 함수이름 | ┗ ( 인자형, $인자이름 ) |
위 함수 선언을 일반적인 방법으로 다시 작성할 수 있습니다.
부 분 | 설 명 |
---|---|
strlen | 함수이름. |
int | 반환 값은 integer형. (즉, 문자열의 길이가 숫자로 측정됨) |
(string $string) | 이 함수의 처음 (이 경우는 하나뿐인) 인자는 string 이라는 이름을 가지는 string형입니다. |
필요적 조건으로 타입에 대한 기본적 이해는 중요합니다. 타입은 다음 표와 같습니다.
# | 이 름 | 설 명 |
---|---|---|
스칼라 형 | booleans | 부울형, bool로 정의 |
integer | 정수형, int로 정의 | |
float (소수, double) | 실수형, double로 정의 | |
string | 문자열형 | |
복합 형 | array | 배열형 |
object | 객체형 | |
특별 형 | resource | 원천 자원 |
null | 비어 있는 값 | |
모의 형 | mixed | 문자열, 정수, 실수, 배열 |
number | 정수, 실수 | |
callback | 함수나 클레스의 호출 | |
void | 인자 비워둠 |
사용자 선언 함수
함수 이름은 변수 이름의 규칙에 따라 자유롭게 문자나 _로 시작하여 문자, 숫자, 그리고 _를 여러 개 가질 수 있지만 특수문자는 사용할 수 없습니다. 다음은 하나의 인자를 사용하여 정의하였습니다.<?php
function test($arg = 'value') {
$retval = 125;
echo " $arg 예제 함수.\n";
return $retval;
}
test(); // 결과: value 예제 함수.
echo test(); // 결과: value 예제 함수. 125
test("좋은"); // 결과: 좋은 예제 함수
$a = "참";
$good = test($a);
echo $good; // 결과: 참 예제 함수 125
?>
하나 이상의 인자를 사용할 경우 쉼표로(,)로 구분해서 사용하면 되는데, 다음과 같이 작성해 줍니다.
<?php
function test($arg1,$arg2,$arg3='bool') {
echo " 예제 함수.\n";
}
$a = 1;
$b = 2;
test($a,$b,$c);
?>
여기서 $a, $b, $c는 인자라 하고, $arg1, $arg2, $arg3은 파라미터(parameter)라 합니다.
$arg3='bool'은 인자에 전달된 변수가 없으면, "bool"을 디폴트로 사용하겠다는 것입니다. 만약, 디폴트 값이 있으면 인자를 비워도 괜찮지만, 없으면 인자를 비워 두어서는 안됩니다.
<?php
function test($a,$b,$c) {
echo "테스트";
}
test($a,$b); // 결과: $c에 디폴트 값이 없으므로 작동하지 않고, PHP 오류 표시가 나옵니다.
?>
인자에 배열이 올 수도 있고, 반환 값이 배열이 될 수도 있습니다.
<?php
function makecoffee($type = "cappuccino") {
return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
/*
결과:
Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.
*/
function mcoffee($types = array("카푸치노"), $coffeeMaker = NULL) {
$device = is_null($coffeeMaker) ? "손" : $coffeeMaker;
return "$device(으)로 ".join(", ", $types)."를 만듭니다.\n";
}
echo mcoffee();
echo mcoffee(array("카푸치노", "에스프레소"), "찻주전자");
/*
결과:
손(으)로 카푸치노를 만듭니다.
찻주전자(으)로 카푸치노, 에스프레소를 만듭니다.
*/
function returncoffee() {
$arr = array("카푸치노", "에스프레소");
return $arr;
}
$arr = returncoffee();
print_r($arr);
/*
결과:
Array
(
[0] => 카푸치노
[1] => 에스프레소
)
*/
?>
반환문
반환문은 for문이나, while문과 같은 루프형이나 함수, 클레스 내에 호출된다면, 함수나 루프의 수행을 즉시 끝내고, return에 결과 값을 넘겨줄 수 있습니다.<?php
function returncoffee() {
$coffee = " 는 맛이 좋습니다."
return "카푸치노" . $coffee;
}
echo returncoffee(); // 결과: 카푸치노 는 맛이 좋습니다.
// 이 함수는 반환값을 갖지 않습니다.
function voidcoffee() {
$coffee = " 는 맛이 좋습니다."
return;
}
echo voidcoffee(); // 결과:
?>
반환문은 함수가 아니라 언어구조이기 때문에 괄호로 묶을 필요는 없습니다. 이는 일반적인 것으로 PHP가 더 적은 일을 하게 합니다만 괄호를 사용해도 큰 문제는 없습니다.
<?php
function small_numbers() {
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
echo "$zero, $one, $two"; // 결과: 0, 1, 2
function myfunc1() {
return('thingy' or die('otherthingy'));
}
function myfunc2() {
return 'thingy' or die('otherthingy');
}
function myfunc3() {
return('thingy') or die('otherthingy');
}
function myfunc4() {
return 'thingy' or 'otherthingy';
}
function myfunc5() {
$x = 'thingy' or 'otherthingy'; return $x;
}
echo myfunc1(). "\n". myfunc2(). "\n". myfunc3(). "\n". myfunc4()
. "\n". myfunc5(). "\n";
// 결과: 1 1 1 1 thingy
?>
다음은 반환 값을 갖지 않지만, global로 대신할 수 있습니다.
<?php
function writefunctionvars() {
global $foo;
$foo = "something";
}
writefunctionvars();
echo $foo; // 결과: something
function writefunctionvars2() {
global $foo2;
$foo2[] = "something";
$foo2[] = "body";
}
writefunctionvars2();
print_r($foo2); // 결과: Array ( [0] => something [1] => body )
?>
재귀 호출
재귀호출은 함수인 자기 자신을 호출하는 것을 말합니다.<?php
function recursion($a){
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
$a = 1;
recursion($a); // 결과: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
function recursion2($a) {
if ($a < 10) {
echo "before: ".$a."\n";
recursion2($a + 1);
echo "after: ".$a."\n";
}
}
recursion2(0);
/*
결과:
before: 0 before: 1 before: 2 before: 3 before: 4 before: 5 before: 6
before: 7
before: 8 before: 9 after: 9 after: 8 after: 7 after: 6 after: 5
after: 4 after: 3 after: 2
*/
?>
익명 함수
익명함수는 이름을 지정하지 않은 함수를 말합니다. 이 기능은 (PHP 5.3)부터 사용가능합니다.<?php
$result = 0;
$one = function(){
var_dump($result);
};
$two = function() use ($result){
var_dump($result);
};
$three = function() use (&$result){
var_dump($result);
};
$result++;
$one(); // 결과:
$two(); // 결과: 0
$three(); // 결과: 1
?>
스스로 동작하는 함수
보통 함수를 정의하고, 호출해야 되는 반면 이 방식은 함수를 정의한 부분에서 바로 그 함수를 호출하는 것입니다.<?php
(function(){ echo "안녕 하보니"; })()
?>
<?php
(function(){
for($i = 1; $i <= 10; $i++){
echo $i + " ";
}
})()
// 1 2 3 4 5 6 7 8 9 10
?>
0 댓글