ホームページ  >  記事  >  バックエンド開発  >  PHP8.0 の機能の簡単な分析: 名前付きパラメーター (名前付きパラメーター)

PHP8.0 の機能の簡単な分析: 名前付きパラメーター (名前付きパラメーター)

青灯夜游
青灯夜游転載
2022-11-18 21:03:121893ブラウズ

PHP8.0 の機能の簡単な分析: 名前付きパラメーター (名前付きパラメーター)

私は何年も前に時間をかけて 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 {}
そして、$options は呼び出しに応じて役立つことが多いため、実際に使用すると、多数の並列呼び出しコードがパラメーターに大量の 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 を追加したいと思ったこともあります:
public static Yar_Concurrent_Client::callArray(array $arguments):null|int|bool {}

しかし、私の強迫性障害のせいで、そうすることは困難だと感じました今朝突然、以前見たことのある RFC のことを思い出したので、ずっと探してみたところ、PHP5.6 の時点でコミットされていたことがわかりました。新しい機能についてほとんど調べておらず、あまり使用していません。みんなが何を言っているのか、使用されるかどうかはわかりません。 ?

は、今日紹介する最初の機能、引数のアンパックです。

引数の展開

PHP が可変パラメーター、つまり可変引数関数をサポートしていることはわかっています。たとえば、次の関数定義の場合:

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、名前付きパラメータ:

名前付きパラメータ

PHP8.0 以降、ユーザーは次のことを許可されます。パラメータを渡すときにパラメータ名を指定します。たとえば、上記の関数の場合:

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 サイトの他の関連記事を参照してください。

声明:
この記事はlaruence.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。