6

これは多くの人にとってばかげた質問のように聞こえるかもしれませんが、なぜ PHP が関数パラメーターで型キャストを許可しないのか疑問に思っています。多くの人がこのメソッドを使用してパラメーターにキャストします。

private function dummy($id,$string){
    echo (int)$id." ".(string)$string
}

または

private function dummy($id,$string){
    $number=(int)$id;
    $name=(string)$string;
    echo $number." ".$name;
}

しかし、他の多くのプログラミング言語を見ると、それらは関数パラメーターへの型キャストを受け入れます。ただし、PHP でこれを行うと、エラーが発生する可能性があります。

private function dummy((int)$id,(string)$string){
    echo $id." ".$string;
}

解析エラー: 構文エラー、予期しない T_INT_CAST、'&' または T_VARIABLE が必要です

または

private function dummy(intval($id),strval($string)){
    echo $id." ".$string;
}

解析エラー: 構文エラー、予期しない '('、'&' または T_VARIABLE が必要です

これが機能しない理由と、方法があるかどうかを知りたいだけです。方法がない場合は、通常の方法で問題ありません。

private function dummy($id,$string){
    echo (int)$id." ".(string)$string;
}
4

3 に答える 3

9

PHP には、配列とオブジェクトに対する初歩的な型ヒント機能がありますが、スカラー型では機能しません。

PHP 5 では、型ヒントが導入されました。関数は、パラメーターをオブジェクト (関数プロトタイプでクラスの名前を指定することにより)、インターフェース、配列 (PHP 5.1 以降)、または呼び出し可能 (PHP 5.4 以降) にすることができるようになりました。ただし、NULL がデフォルトのパラメータ値として使用されている場合は、以降の呼び出しの引数として許可されます。

クラスまたはインターフェースが型ヒントとして指定されている場合、そのすべての子または実装も許可されます。

型ヒントは、int や string などのスカラー型では使用できません。特性も許可されていません。

配列ヒントの例:

public function needs_array(array $arr) {
    var_dump($arr);
}

オブジェクトヒントの例

public function needs_myClass(myClass $obj) {
    var_dump($obj);
}

スカラー型を強制する必要がある場合は、関数内の型を型キャストまたはチェックし、間違った型を受け取った場合は救済するか、それに応じて行動する必要があります。

間違った型を取得した場合に例外をスローする

public function needs_int_and_string($int, $str) {
   if (!ctype_digit(strval($int)) {
     throw new Exception('$int must be an int');
   }
   if (strval($str) !== $str) {
     throw new Exception('$str must be a string');
   }
}

パラメータを静かに型キャストするだけです

public function needs_int_and_string($int, $str) {
   $int = intval($int);
   $str = strval($str);
}

更新: PHP 7 はスカラー型ヒントを追加します

PHP 7 では、strict モードと non-strict モードのScalar 型宣言が導入されました。TypeError関数の引数変数が宣言された型と正確に一致しない場合に厳密モードでa をスローしたり、非厳密モードで型を強制したりできるようになりました。

declare(strict_types=1);

function int_only(int $i) {
   // echo $i;
}

$input_string = "123"; // string
int_only($input);
//  TypeError: Argument 1 passed to int_only() must be of the type integer, string given
于 2012-07-14T00:01:50.970 に答える
3

PHP はこれをオブジェクト型に対してのみ許可します。それ以外の場合、言語の型付けが非常に緩いためだと思います。このことを考慮:

<?php
class Foo {

    public function dummy(int $id, string $string){
        echo $id." ".$string;
    }

}

$foo = new Foo();
$foo->dummy(1, "me");

このコードは構文的には問題ありません (つまり、コンパイルされます) が、実行時エラーが発生します。

キャッチ可能な致命的なエラー: Foo::dummy() に渡される引数 1 は、11 行目で /Users/christrahey/tes.php で呼び出され、11 行目で /Users/christrahey/tes.php で定義された int のインスタンスである必要があります。 4

という名前のクラスのインスタンスを探していることに注意してくださいint

于 2012-07-14T00:02:40.310 に答える