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부터 커밋이 되었지만 어쨌거나 저는 비교적 구식이고, 새로운 기능에 대한 연구도 거의 하지 않았고, 많이 사용해 본 적도 없습니다. 모두가 사용할지는 모르겠습니다. ?
오늘 소개할 첫 번째 기능은 인수 풀기입니다.
인수 압축해제
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
$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!