PHP関数の型宣言の概要

藏色散人
リリース: 2023-04-07 19:16:01
転載
3362 人が閲覧しました

PHP7 はスカラー型宣言のサポートを開始し、厳密に型指定された言語の風味が比較的強くなりました。この機能を使用する過程で 2 つの落とし穴に遭遇しました。1 回目はブール型パラメーターを宣言するとき、そして最近では double 型パラメーターを宣言するときに、どちらも実行時エラーが発生しました。今後同じような間違いをしないように、ここ数日公式文書を読みました。この記事は、PHP 関数での型宣言の使用法を読んだ後にまとめたものです。

文法的には、PHP 関数定義はいくつかの時代を経てきました。

古代 (PHP 4)

関数の定義は非常に簡単です。関数名(args) {body}の構文宣言。パラメータと戻り値の型は指定できません。また、可能なパラメータと戻り値の型は無制限です。これは、関数を宣言する最も一般的な方法です。

配列および参照型のパラメータ値の宣言 (PHP 5)

関数宣言では、配列、クラス、インターフェイス、および呼び出し可能オブジェクトを使用できます。 5.6 以降、定数 (クラス定数を含む) がデフォルトのパラメーターとしてサポートされ、パラメーター配列 (先頭に省略記号が付く) もサポートされます。例:

function sum(...$numbers) {
    $sum = 0;
    foreach ($numbers as $number) {
        $sum += $number;
    }
    return $sum;
}
ログイン後にコピー

注: パラメータの値が null の可能性がある場合は、パラメータのデフォルト値を null にする必要があります。そうしないと、呼び出し時にエラーが発生します。例:

function foo(array $arr = null) {
    ...
}
ログイン後にコピー

スカラー型と戻り値の宣言 (PHP 7)

この関数は、スカラー型 (int、bool、float、string) と戻り値を正式にサポートしています。タイプ (宣言可能なタイプはパラメータと同じです) 宣言。このバージョンからは、構文の違いを除いて、厳密に型指定された言語と同様に関数宣言を形式的に行うことができるようになりました。

残念ながら、関数の戻り値がnullになる可能性がある場合、戻り値の型を指定することはできません。例:

function getModel() : Foo {
    if ($this->_model === null) {
         $this->_model = xxxx;  // get from db or otherelse
    }
    return $this->_model;     // 如果$this->_model仍是null,运行出错
}
ログイン後にコピー

パラメータと戻り値は null および void 戻り値の型宣言 (PHP 7.1)

パラメータと戻り値の型が null の場合、型は次のようになります。先頭に疑問符 (?) が付きます。変更により、null 値の問題を解決できます (デフォルトのパラメーターと競合しません)。型宣言により反復可能が追加され、void 型の戻り値もサポートされます。例:

function getModel(?int $id) : ?Foo {
    if ($id !== null) {
        $this->_model = xxxx;
    } else {
        $this->_model = yyyy;
    }
    return $this->_model;
}
// 调用
$foo->getModel(null);
$foo->getModel(100);
// 函数声明了参数并且没有提供默认参数,调用时不传入参数会引发错误
// 将函数声明改成 getModel(?int $id = 100) {},可以不传参数
$foo->getModel();
ログイン後にコピー

関数の戻り値が void の場合、関数本体は何も返すことができません (return void; と書くのも間違いです!)、または return ステートメントを省略できます。

function test(array $arr) : void {
    if (!count($arr) {
        return;
    }
    // 不要return;
    array_walk($arr, function ($elem) {xxxx});
}
ログイン後にコピー

上記の歴史的な変更を振り返ると、PHP 7.1 では関数の型宣言が非常に完全になっていることがわかります (ただし、実際にはあまり使用されていません)。この記事ではパラメーターと戻り値の型宣言について説明していることに注意してください。PHP は、パラメーターの型が操作中に変更されないことを保証しません。つまり、次のコードは正当です:

function foo(array $arr) : array {
    // change $arr from array to int
    $arr = 3;
    return [];
}
ログイン後にコピー

この観点から見ると、PHP は次のようになります。まだ型付けが弱い言語なので、静的コンパイルはできません。

実際に遭遇する落とし穴について話しましょう。公式ドキュメントによると、関数のパラメータと戻り値の型宣言に使用できる型は次のとおりです。

# クラス/インターフェイス

# self、独自のメソッド

でのみ使用できます。

# 配列

##● bool

##● callable

##● int

##● float

##● string

● iterable

● void (戻り値でのみ使用)

リストには boolean 型と double 型が存在しないことに注意してください。これら 2 つの型を定義しない限り、パラメータや戻り値でこれらを使用することは間違っています。

これは、PHP が少し面倒な点でもあります。通常使用される 2 つのキーワード double と float はほぼ同じで、たとえば、doubleval は floatval のエイリアス、is_double は is_float のエイリアスで、(double) と (float) は変換時に同じ効果を持ちます。ただし、型宣言で使用する場合は異なり、bool と boolean でも同じ状況が発生します。

概要

PHP 7.2 の安定版がリリースされました。新しいプロジェクトでは PHP 7.1 以降のバージョンを使用することをお勧めします。明確で保守しやすいコードを作成するには、宣言型を使用することをお勧めします。 null 値は参照型または文字列にのみ使用し、int/float などのスカラー型パラメーターには null を使用しないようにすることをお勧めします。必要な場合を除き、func_get_argc やその他の関数は使用しないようにしてください。

以上がPHP関数の型宣言の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート