수색…


통사론

  • 함수 func_name ($ parameterName1, $ parameterName2) {코드 _to_run (); }
  • function func_name ($ optionalParameter = default_value) {코드 _to_run (); }
  • function func_name (type_name $ parameterName) {코드 _to_run (); }
  • 함수 & returns_by_reference () {코드 _to_run (); }
  • 함수 func_name (& $ referenceParameter) {코드 _to_run (); }
  • 함수 func_name (... $ variadicParameters) {코드 _to_run (); } // PHP 5.6+
  • function func_name (type_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
  • function func_name () : return_type {코드 _To_run (); } // PHP 7.0 이상

기본 기능 사용법

기본 함수는 다음과 같이 정의되고 실행됩니다.

function hello($name)
{
    print "Hello $name";
}

hello("Alice");

선택적 매개 변수

함수에는 선택적 매개 변수가있을 수 있습니다. 예를 들면 다음과 같습니다.

function hello($name, $style = 'Formal')
{
    switch ($style) {
        case 'Formal':
            print "Good Day $name";
            break;
        case 'Informal':
            print "Hi $name";
            break;
        case 'Australian':
            print "G'day $name";
            break;
        default:
            print "Hello $name";
            break;
    }
}

hello('Alice');
    // Good Day Alice

hello('Alice', 'Australian');
    // G'day Alice

참조로 인수 전달하기

함수 인수는 "참조로"전달 될 수 있으므로 함수가 함수 외부에서 사용되는 변수를 수정할 수 있습니다.

function pluralize(&$word)
{
    if (substr($word, -1) == 'y') {
        $word = substr($word, 0, -1) . 'ies';
    } else {
      $word .= 's';
    }
}

$word = 'Bannana';
pluralize($word);

print $word;
  // Bannanas

객체 인수는 항상 참조로 전달됩니다.

function addOneDay($date)
{
    $date->modify('+1 day');
}

$date = new DateTime('2014-02-28');
addOneDay($date);

print $date->format('Y-m-d');
  // 2014-03-01

객체를 참조로 암시 적으로 전달하지 않으려면 객체를 clone 해야합니다.

참조를 통한 전달은 매개 변수를 반환하는 다른 방법으로 사용할 수도 있습니다. 예를 들어, socket_getpeername 함수는 다음과 같습니다.

bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )

이 메서드는 실제로 피어의 주소와 포트를 반환하는 것을 목표로하지만 반환 할 값이 두 개이므로 참조 매개 변수를 대신 선택합니다. 다음과 같이 호출 할 수 있습니다.

if(!socket_getpeername($socket, $address, $port)) {
    throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";

변수 $address$port 는 이전에 정의 할 필요가 없습니다. 그들은 할 것이다:

  1. 먼저 null 로 정의되고,
  2. 그 다음 미리 정의 된 null 가진 함수로 전달됩니다
  3. 다음 함수에서 수정
  4. 결국은 호출 컨텍스트의 주소와 포트로 정의됩니다.

가변 길이 인수 목록

5.6

PHP 5.6에서는 매개 변수가 가변적임을 나타 내기 위해 인수 이름 앞에 ... token을 사용하여 가변 길이 인수 목록 (일명 varargs, 가변 인자)을 도입했습니다 ... 즉, 매개 변수가 가변적임을 나타냅니다. 즉, 그 이후부터 제공된 모든 매개 변수를 포함하는 배열입니다.

function variadic_func($nonVariadic, ...$variadic) {
    echo json_encode($variadic);
}

variadic_func(1, 2, 3, 4); // prints [2,3,4]

유형 이름은 앞에 추가 할 수 있습니다 ... :

function foo(Bar ...$bars) {}

& reference 연산자는 ... 앞에 있지만 형식 이름 뒤에 추가 될 수 있습니다 (있는 경우). 다음 예제를 고려하십시오.

class Foo{}
function a(Foo &...$foos){
    $i = 0;
    foreach($a as &$foo){ // note the &
        $foo = $i++;
    }
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);

산출:

int(0)
int(1)
int(1)

한편, 인수의 배열 (또는 Traversable )은 인수 목록 형식의 함수에 전달되도록 압축을 풀 수 있습니다.

var_dump(...hash_algos());

산출:

string(3) "md2"
string(3) "md4"
string(3) "md5"
...

사용하지 않고이 조각과 비교 ... :

var_dump(hash_algos());

산출:

array(46) {
  [0]=>
  string(3) "md2"
  [1]=>
  string(3) "md4"
  ...
}

따라서 variadic 함수에 대한 리디렉션 함수를 쉽게 만들 수 있습니다. 예를 들면 다음과 같습니다.

public function formatQuery($query, ...$args){
    return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}

배열과는 별도로 Iterator 와 같은 Traversable (특히 SPL의 여러 하위 클래스)을 사용할 수도 있습니다. 예 :

$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304

이터레이터가 무한 반복되는 경우 (예 :

$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);

다른 버전의 PHP는 다르게 작동합니다.

  • PHP 7.0.0에서 PHP 7.1.0 (베타 1)까지 :
    • 분할 오류가 발생합니다.
    • PHP 프로세스가 코드 139와 함께 종료됩니다.
  • PHP 5.6에서 :
    • 치명적인 메모리 고갈 오류 ( "허용 된 메모리 크기 % d 바이트 초과")가 표시됩니다.
    • 코드가 255 인 PHP 프로세스가 종료됩니다.

주 : HHVM (v3.10 - v3.12)은 Traversable 의 언팩을 지원하지 않습니다. 이 시도에서는 "컨테이너 만 압축을 풀 수 있습니다"라는 경고 메시지가 표시됩니다.

기능 범위

함수 내부의 변수는 다음과 같은 로컬 범위 안에 있습니다.

$number = 5
function foo(){
    $number = 10
    return $number
}

foo(); //Will print 10 because text defined inside function is a local variable


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow