PHP
기능적 프로그래밍
수색…
소개
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;
});