>  기사  >  백엔드 개발  >  PHP8.0 기능에 대한 간략한 분석: Named Parameter(named 매개변수)

PHP8.0 기능에 대한 간략한 분석: Named Parameter(named 매개변수)

青灯夜游
青灯夜游앞으로
2022-11-18 21:03:121923검색

PHP8.0 기능에 대한 간략한 분석: Named Parameter(named 매개변수)

Yar의 성능을 향상시키기 위해 몇 년 전의 시간을 보냈지만, 초기에 좋은 디자인, 즉 RPC를 병렬로 호출할 때 디자인이 부족해서 조금 불편했던 문제에 직면하기도 했습니다. 현재 메소드의 프로토타입은 다음과 같습니다.

public static Yar_Concurrent_Client::call(string $uri, string $method, ?array $arguments = NULL, ?callable $callback = NULL, ?callable $error_callback = NULL, ?array $options = NULL):null|int|bool {}

언뜻 보면 너무 압도적이지 않나요?

실제 사용에서는 콜백 함수와 오류 콜백 함수가 비어 있을 가능성이 매우 높기 때문에 호출이 실제로 시작될 수 있을 때, 즉 루프가 다시 전역적으로 지정될 때:

Yar_Concurrent_Client::loop(?callable $callback = NULL, ?callable $error_callback = NULL, ?array $options = NULL):?bool {}

그리고 여러 번 $ 옵션은 호출에 따라 유용하므로 실제로 사용하면 많은 수의 병렬 호출 코드가 매개변수에 NULL을 많이 기록하게 됩니다. .한번은

Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val1"));
Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val2"));
Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val2"));
Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val4"));

와 유사한 다형성을 사용하거나 새로운 API를 추가하고 싶었지만 강박 장애로 인해 오늘 아침에 갑자기 RFC가 생각났습니다. 예전에 본 적이 있어서 한참을 찾아보니 PHP 5.6부터 커밋이 되었지만 어쨌거나 저는 비교적 구식이고, 새로운 기능에 대한 연구도 거의 하지 않았고, 많이 사용해 본 적도 없습니다. 모두가 사용할지는 모르겠습니다. ?

오늘 소개할 첫 번째 기능은 인수 풀기입니다.

인수 압축해제

우리는 PHP가 가변 매개변수, 즉 가변 함수를 지원한다는 것을 알고 있습니다. 예를 들어 다음 함수 정의의 경우:

public static Yar_Concurrent_Client::callArray(array $arguments):null|int|bool {}

세 개의 점을 사용하여 매개변수 정의에 주의하세요... (줄임표 기호) 즉, 당신이 어디에 있든 상관없이 이 함수를 호출할 때 전달되는 매개변수 수는 $arguments:

function variadic(...$arguments) {
    var_dump($arguments);
}

라는 배열에 포함됩니다. 물론 이것은 오늘 우리가 사용할 것이 아닙니다. 호출할 때 사용되는 해당 형식의 형제 형식을 인수 풀기라고 합니다.

예를 들어 위의 질문과 비슷하게 함수를 정의합니다.

variadic();
//output: array(0) { }
variadic(NULL);
//output: array(1) { [0]=> NULL }
variadic("foo", "bar");
//output: array(2) { [0]=> string(3) "foo"  [1]=> string(3) "bar" }
variadic(NULL, array(), "dummy");
//output: array(3) { [0]=> NULL [1]=>[] [2]=> string(5) "dummy" }

대부분의 경우 매개 변수 b, c, d가 모두 NULL이지만 e를 전달해야 할 수도 있습니다. 그런 다음 다음과 유사하게 인수 풀기 기능을 사용하여 코드에서 많은 수의 NULL 매개 변수를 피할 수 있습니다.

function dummy($a, $b = NULL, $c = NULL, $d = NULL, $e = NULL) {
    var_dump($a, $b, $c, $d, $e);
}

호출할 때 나도 사용했습니다... 배열의 압축을 풀고... 호출된 함수에 순서대로 순서를 지정하는 것입니다. 첫 번째 요소는 첫 번째 매개변수에 해당하고 두 번째 요소는 두 번째 요소에 해당합니다.

그러나 여기서 위치는 채우기 위치와 관련이 있으며 색인과 아무 관련이 없습니다. 즉,

$arguments = array(
    "First argument",
    NULL,  NULL,  NULL,
    "Fifth argument",
);
 
dummy(...$arguments);
 
//output:
// string(14) "First argument"
// NULL
// NULL
// NULL
// string(14) "Fifth argument"

이 양식에서 색인 4는 여전히 첫 번째 매개변수로 간주됩니다.

이 문제를 생각한 후 갑자기 Yar에 새로운 것을 도입할 필요가 없다는 것을 깨달았습니다. 가장 일반적인 예는 다음과 같습니다.

$arguments = array(
    4=> "First argument",
    0=> "Fifth argument"
),

이게 끝났다고 생각하시나요?

위 코드를 보면 여전히 문제가 있습니다. 즉, 강박 장애가 있는 사람들에게는 여전히 약간...

그러나 실제로는 중간 배열을 구성해야 합니다. , PHP8.0에 도입된 방법을 사용할 수도 있습니다. 또 다른 RFC, 명명된 매개변수:

Named Parameter

PHP8.0 이후 사용자는 매개변수를 전달할 때 매개변수 이름을 지정할 수 있습니다. 예를 들어 위의 예제 함수의 경우:

$arguments = array(
    "https://xxx.com/api",
    "method",
    array("arguments"),
    NULL, NULL, 
    "options" => array(YAR_OPT_HEADER => array("header:val1")
)
Yar_Concurrent_Clinet::call(...$arguments);
 
$arguments["options"][YAR_OPT_HADER] = ["header:val2"];
Yar_Concurrent_Clinet::call(...$arguments);
 
$arguments["options"][YAR_OPT_HADER] = ["header:val3"];
Yar_Concurrent_Clinet::call(...$arguments);
 
$arguments["options"][YAR_OPT_HADER] = ["header:val4"];
Yar_Concurrent_Clinet::call(...$arguments);
Yar_Concurrent_Clinet::call(...$arguments);

이제 호출할 수 있습니다. 전달될 매개변수 이름을 지정합니다. 예:

function dummy($a, $b = NULL, $c = NULL, $d = NULL, $e = NULL) {
    var_dump($a, $b, $c, $d, $e);
}

즉, a와 e에 전달될 매개변수를 지정했으며 지정하지 않으면 기본값은 기본값이 됩니다. .

dummy(a:"dummy", e:"foo");
//output:
// string(5) "dummy"
// NULL
// NULL
// NULL
// string(3) "foo"

와 같이 선언 순서를 따르지 않아도 됩니다. 출력은 동일합니다.

이런 식으로 시작 부분의 코드는 다음과 같습니다.

dummy(e:"foo", a:"dummy");

원하는 것을 호출할 때 전달할 수 있습니다.

인수 압축 해제에 비해 코드가 여전히 약간 길지만 둘 다입니다. 너무 많은 NULL을 작성할 필요가 없고 새로운 중간 변수를 도입하지 않아도 되는 문제.

그래서 문제는 완벽하게 해결되었고, 굳이 새로운 API를 도입할 필요도 없군요 :)

원본주소 : https://www.laruence.com/2022/05/10/6192.html

추천 학습: "
PHP 비디오 튜토리얼

위 내용은 PHP8.0 기능에 대한 간략한 분석: Named Parameter(named 매개변수)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 laruence.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제