수색…


소개

PHP의 함수형 프로그래밍은 함수에 의존합니다. PHP의 함수는 일련의 작업을 수행 할 수 있도록 체계적이고 재사용 가능한 코드를 제공합니다. 함수는 코딩 프로세스를 단순화하고 중복 논리를 방지하며 코드를 쉽게 따르도록합니다. 이 주제에서는 PHP의 함수, 인수, 매개 변수, return 문 및 범위의 선언 및 사용에 대해 설명합니다.

변수에 지정

익명 함수 는 변수에 할당되어 콜백이 필요한 곳에 매개 변수로 사용할 수 있습니다.

$uppercase = function($data) {
    return strtoupper($data);
};

$mixedCase = ["Hello", "World"];
$uppercased = array_map($uppercase, $mixedCase);
print_r($uppercased);

이 변수는 독립형 함수 호출로 사용할 수도 있습니다.

echo $uppercase("Hello world!"); // HELLO WORLD!

외부 변수 사용하기

use 구문은 변수를 익명 함수의 범위로 가져 오는 데 사용됩니다.

$divisor = 2332;
$myfunction = function($number) use ($divisor) {
    return $number / $divisor;
};

echo $myfunction(81620); //Outputs 35

참조로 변수를 가져올 수도 있습니다.

$collection = [];

$additem = function($item) use (&$collection) {
    $collection[] = $item;
};

$additem(1);
$additem(2);

//$collection is now [1,2]

콜백 함수를 매개 변수로 전달

call_user_func() , usort()array_map() 과 같이 사용자 정의 콜백 함수를 매개 변수로 받아들이는 여러 가지 PHP 함수가 있습니다.

사용자 정의 콜백 함수가 정의 된 위치에 따라 여러 가지 방법으로 전달할 수 있습니다.

절차 적 스타일 :

function square($number)
{
    return $number * $number;
}

$initial_array = [1, 2, 3, 4, 5];
$final_array = array_map('square', $initial_array);
var_dump($final_array); // prints the new array with 1, 4, 9, 16, 25

객체 지향 스타일 :

class SquareHolder
{
    function square($number)
    {
        return $number * $number;
    }
}

$squaredHolder = new SquareHolder();
$initial_array = [1, 2, 3, 4, 5];
$final_array = array_map([$squaredHolder, 'square'], $initial_array);

var_dump($final_array); // prints the new array with 1, 4, 9, 16, 25

정적 메서드를 사용하는 객체 지향 스타일 :

class StaticSquareHolder
{
    public static function square($number)
    {
        return $number * $number;
    }
}

$initial_array = [1, 2, 3, 4, 5];
$final_array = array_map(['StaticSquareHolder', 'square'], $initial_array);
// or:
$final_array = array_map('StaticSquareHolder::square', $initial_array); // for PHP >= 5.2.3

var_dump($final_array); // prints the new array with 1, 4, 9, 16, 25

내장 함수를 콜백으로 사용하기

인수로 callable 할 수있는 함수에서 PHP 내장 함수로 문자열을 넣을 수도 있습니다. 배열의 모든 문자열에서 선행 및 후행 공백을 제거하려면 array_map 매개 변수로 trim 을 사용하는 것이 일반적입니다.

$arr = ['   one  ', 'two   ', '   three'];
var_dump(array_map('trim', $arr));

// array(3) {
//   [0] =>
//   string(3) "one"
//   [1] =>
//   string(3) "two"
//   [2] =>
//   string(5) "three"
// }

익명 기능

익명 함수는 이름이없는 함수 일뿐입니다.

// Anonymous function
function() {
    return "Hello World!";
};

PHP에서 익명 함수는 표현식 처럼 취급되기 때문에 이러한 이유로 세미콜론으로 끝나야합니다 ; .

익명 함수는 변수에 할당 되어야합니다.

// Anonymous function assigned to a variable
$sayHello = function($name) {
    return "Hello $name!";
};

print $sayHello('John'); // Hello John

또는 다른 함수의 매개 변수전달 되어야합니다.

$users = [
    ['name' => 'Alice', 'age' => 20], 
    ['name' => 'Bobby', 'age' => 22], 
    ['name' => 'Carol', 'age' => 17]
];

// Map function applying anonymous function
$userName = array_map(function($user) {
    return $user['name'];
}, $users);

print_r($usersName); // ['Alice', 'Bobby', 'Carol']

또는 다른 함수에서 반환 되었습니다.

자체 실행 익명 기능 :

// For PHP 7.x
(function () {
    echo "Hello world!";
})();

// For PHP 5.x
call_user_func(function () {
    echo "Hello world!";
});

자체 실행 익명 함수에 인수 전달 :

// For PHP 7.x
(function ($name) {
    echo "Hello $name!";
})('John');

// For PHP 5.x
call_user_func(function ($name) {
    echo "Hello $name!";
}, 'John');

범위

PHP에서 익명 함수는 다른 PHP 함수와 마찬가지로 자체 범위 를가집니다.

JavaScript에서는 익명의 함수가 외부 범위의 변수에 액세스 할 수 있습니다. 그러나 PHP에서는 허용되지 않습니다.

$name = 'John';

// Anonymous function trying access outside scope
$sayHello = function() {
    return "Hello $name!";
}

print $sayHello('John'); // Hello !
// With notices active, there is also an Undefined variable $name notice

마감

클로저는 외부 범위에 액세스 할 수없는 익명의 함수입니다.

익명 함수를 정의 할 때, 당신은 그 함수를위한 "네임 스페이스"를 만들고 있습니다. 현재는 해당 네임 스페이스에만 액세스 할 수 있습니다.

$externalVariable = "Hello";
$secondExternalVariable = "Foo"; 
$myFunction = function() { 
  
  var_dump($externalVariable, $secondExternalVariable); // returns two error notice, since the variables aren´t defined 

}

외부 변수에 액세스 할 수 없습니다. 이 네임 스페이스가 외부 변수에 접근 할 수있는 권한을 부여하려면 클로저 ( use() )를 통해이 네임 스페이스를 소개해야한다.

$myFunction = function() use($externalVariable, $secondExternalVariable) {
   var_dump($externalVariable, $secondExternalVariable); // Hello Foo
}

이것은 PHP의 엄격한 변수 범위 지정에 크게 의존합니다 - 변수가 범위 내에 정의되어 있지 않거나 global 변수로 가져 오지 않으면 변수가 존재하지 않습니다.

참고 사항 :

상위 범위에서 변수를 상속하는 것은 전역 변수를 사용하는 것과 동일하지 않습니다. 전역 변수는 전역 범위에 존재하며 어떤 함수가 실행 되더라도 동일합니다.

클로저의 부모 범위는 클로저가 선언 된 함수입니다 (반드시 호출 된 함수 일 필요는 없습니다).

익명 함수를위한 PHP 문서 에서 가져온 것


PHP에서 closure는 초기 바인딩 접근 방식을 사용합니다. 즉, use 키워드를 use 하여 클로저의 네임 스페이스에 전달 된 변수는 클로저가 정의 될 때 동일한 값을 갖게됩니다.

이 동작을 변경하려면 변수 를 참조로 전달해야합니다.

$rate = .05;

// Exports variable to closure's scope
$calculateTax = function ($value) use ($rate) {
    return $value * $rate;
};

$rate = .1; 

print $calculateTax(100); // 5
$rate = .05;

// Exports variable to closure's scope
$calculateTax = function ($value) use (&$rate) { // notice the & before $rate
    return $value * $rate;
};

$rate = .1;

print $calculateTax(100); // 10

클로저가있는 /없는 익명 함수를 정의 할 때 기본 인수가 암시 적으로 필요하지 않습니다.

$message = 'Im yelling at you';

$yell = function() use($message) {
    echo strtoupper($message);
};

$yell(); // returns: IM YELLING AT YOU

순수 함수

순수한 함수 는 동일한 입력을 받으면 항상 동일한 출력을 리턴하고 부작용 이없는 함수입니다.

// This is a pure function
function add($a, $b) {
    return $a + $b;
}

일부 부작용파일 시스템을 변경하고 데이터베이스와 상호 작용 하며 화면에 인쇄합니다 .

// This is an impure function
function add($a, $b) {
    echo "Adding...";
    return $a + $b;
}

함수로서의 객체

class SomeClass {
    public function __invoke($param1, $param2) {
        // put your code here
    }
}

$instance = new SomeClass();
$instance('First', 'Second'); // call the __invoke() method

__invoke 메소드가있는 객체는 다른 함수와 똑같이 사용할 수 있습니다.

__invoke 메서드는 개체의 모든 속성에 액세스 할 수 있으며 모든 메서드를 호출 할 수 있습니다.

PHP의 일반적인 함수 메소드

매핑

배열의 모든 요소에 함수를 적용 :

array_map('strtoupper', $array);

이것이 콜백이 가장 먼저 나오는 목록의 유일한 방법이라는 점에 유의하십시오.

축소 (또는 접기)

배열을 단일 값으로 줄이기 :

$sum = array_reduce($numbers, function ($carry, $number) {
   return $carry + $number;
});

필터링

콜백이 true 를 반환하는 배열 항목 만 반환 true .

$onlyEven = array_filter($numbers, function ($number) {
    return ($number % 2) === 0;
});


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