私は何年も前に時間をかけて 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 {}
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"));
public static Yar_Concurrent_Client::callArray(array $arguments):null|int|bool {}
しかし、私の強迫性障害のせいで、そうすることは困難だと感じました今朝突然、以前見たことのある RFC のことを思い出したので、ずっと探してみたところ、PHP5.6 の時点でコミットされていたことがわかりました。新しい機能についてほとんど調べておらず、あまり使用していません。みんなが何を言っているのか、使用されるかどうかはわかりません。 ?
は、今日紹介する最初の機能、引数のアンパックです。
引数の展開
function variadic(...$arguments) { var_dump($arguments); }
の定義に注意してください。これは、この関数を呼び出すときに渡すパラメーターの数に関係なく、これらのパラメーターは $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" }
もちろん、これは現在あるものではありません。この機能を使用するには、引数アンパックと呼ばれる、呼び出し時に使用される対応する兄弟形式もあります。
たとえば、上記の質問と同様に、関数を定義しました
function dummy($a, $b = NULL, $c = NULL, $d = NULL, $e = NULL) { var_dump($a, $b, $c, $d, $e); }
パラメータ b、c、d がほとんどの場合すべて NULL であるが、e を渡す必要がある場合は、引数のアンパックを使用して、コード内に多数の NULL パラメータが含まれるのを避けることができます。次のようになります。
$arguments = array( "First argument", NULL, NULL, NULL, "Fifth argument", ); dummy(...$arguments); //output: // string(14) "First argument" // NULL // NULL // NULL // string(14) "Fifth argument"
注 呼び出し時に... も使用しました。これは、... の後に配列をアンラップし、呼び出された関数に順番に渡すことを意味します。最初の要素は最初のパラメーターに対応し、2 番目の要素は要素は 3 番目のパラメータに対応します。
ただし、ここでの位置は充填位置に関連しており、インデックスとは何の関係もないことに注意してください。つまり:
$arguments = array( 4=> "First argument", 0=> "Fifth argument" ),
この形式では、インデックス 4 は依然として最初とみなされます。パラメータ。
これについて考えた後、Yar に新しいものを導入する必要がないことに突然気づきました。最もオープンな例は次のとおりです:
$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);
これで終わりだと思いますか?
上記のコードを考慮すると、中間配列を構築する必要があるという問題がまだあります。 ..
しかし実際には、PHP8.0 で導入された別の RFC、名前付きパラメータ:
名前付きパラメータ
function dummy($a, $b = NULL, $c = NULL, $d = NULL, $e = NULL) { var_dump($a, $b, $c, $d, $e); }
呼び出し時に渡すパラメータ名を次のように指定できます。
dummy(a:"dummy", e:"foo"); //output: // string(5) "dummy" // NULL // NULL // NULL // string(3) "foo"
つまり、 a と e に渡されるパラメータを指定しました。指定されていない場合はデフォルト値が使用されます。宣言の順序以外でも実行できます。例:
dummy(e:"foo", a:"dummy");
出力結果同じです。
このようにして、最初のコードは次のようになります。
Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val1"))); Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val2"))); Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val3"))); Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val4")));
呼び出し時にあれやこれを渡すことができ、好きなように渡すことができます
コードはまだ引数のアンパックよりも少し長くなりますが、これにより、多くの NULL を書き込む必要がないという問題が解決され、新しい中間変数が導入されません。
つまり、問題は完全に解決されており、新しい API を導入する必要はありません:)
元のアドレス: https://www.laruence.com/2022 /05/10/ 6192.html推奨学習: 「PHP ビデオ チュートリアル
以上がPHP8.0 の機能の簡単な分析: 名前付きパラメーター (名前付きパラメーター)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。