この記事ではメソッドのパラメータの型宣言の学習方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
#どのような業界に従事しているとしても、特にプログラマーである私たちにとっては、生きて学ぶことがトレンドになっています。今回は新しい技術が適用できないのは当然ですが、このメソッドパラメータの型宣言など、PHPのドキュメントを読んだだけではよくわからない知識がたくさんあります。
前回の記事では、PHP のメソッド パラメーターの型制約について、メソッド パラメーターの型制約はクラス、インターフェイス、配列、または呼び出し可能なコールバック関数に限定されると述べましたが、実際にはこれは厳密ではありません。 PHPにも厳密モードの定義があり、厳密モードを指定する場合はメソッドパラメータの型に通常のスカラー型を指定することも有効です。
厳密モードの定義:
declare (strict_types = 1);
function testInt(int $a) { echo $a, PHP_EOL; } testInt(1); // testInt(1.1); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int // testInt('52AABB'); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int // testInt(true); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int
厳密モードでは、このメソッドのパラメータは受信後にのみ使用できることは明らかです。 int型の値は受け取れません、それ以外の型は受け付けられません もちろん、前回の記事で述べたような強制変換は発生しません。
function testFloat(float $a) { echo $a, PHP_EOL; } testFloat(1); testFloat(1.1); // testFloat('52AABB'); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int // testInt(true); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int
PHP には int と float しかなく、float は int のスーパーセットであるため、ここでは整数を渡すことができることに注意してください。 , 上記のtestInt(int $a)は1.1などのfloat値を受け取ることができません。これにはアップコンバージョンとダウンコンバートの問題が関係しており、スーパーセットへの変換は問題ありませんが、スーパーセットからサブセットへの変換は問題ありません。
function testString(string $a) { echo $a, PHP_EOL; } // testString(1); // Fatal error: Uncaught TypeError: Argument 1 passed to testString() must be of the type string // testString(1.1); // Fatal error: Uncaught TypeError: Argument 1 passed to testString() must be of the type string testString('52AABB'); // testString(true); // Fatal error: Uncaught TypeError: Argument 1 passed to testString() must be of the type string
あまり説明する必要はありませんが、非厳密モードでは、文字列型の受信パラメータを定義すると、実際にはどのような型でも構いません。文字列型として受け取られるので、ここで型変換について語る必要はなく、非厳密モードで文字列型を定義した場合の効果は何も定義しない場合と同じであると言えます。ただし、厳密モードでは異なり、実際には二重引用符または一重引用符で囲まれた文字列コンテンツのみを受け取ることができます。
function testBool(bool $a) { var_dump($a); } testBool(true); testBool(false); // testBool('52AABB'); // Fatal error: Uncaught TypeError: Argument 1 passed to testBool() must be of the type bool // testBool(1); // Fatal error: Uncaught TypeError: Argument 1 passed to testBool() must be of the type bool
ブール値についても同様で、ここでは true と false のキーワードの値のみを受け取ることができます。
最後に、新しいやつを紹介しましょう。通常モードのクラス、配列、コールバック関数に加えて、厳密モードのさまざまなスカラー型mode 宣言の他に反復可能な型の宣言もありますが、この言葉からも分かると思いますが、反復可能な型です。
function testIterable(iterable $iterator) { echo gettype($iterator), ':', PHP_EOL; foreach ($iterator as $it) { echo $it, PHP_EOL; } } testIterable([1, 2, 3]); testIterable(new ArrayIterator([1, 2, 3])); // Generator对象 testIterable((function () { yield 1; yield 2; yield 3; })()); // testIterable(1); // Fatal error: Uncaught TypeError: Argument 1 passed to testIterable() must be iterable
はい、配列、イテレータ インターフェイスを実装するクラス、ジェネレータ関連のコンテンツが含まれています。つまり、foreach で反復できる内容はすべて渡すことができます。ジェネレーター自体は Generator オブジェクトになります。PHP ジェネレーターの使用方法の学習に関するこの記事で、この Generator オブジェクトの内容をすでに見てきましたが、このオブジェクト自体も Iterator インターフェイスを実装しています。
冒頭でも触れましたが、厳密モードでは文法が大きく異なることが分かり、今回は本当に勉強になりました。まだまだ私たちもまだまだですが、これからも注目して一緒に頑張っていただければ幸いです! !
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/%E5%86%8D%E6%AC%A1%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0%E7%B1%BB%E5%9E%8B%E5%A3%B0%E6%98%8E.php
推奨学習: php ビデオ チュートリアル
以上がメソッドパラメータの型宣言を学ぶ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。