5

PHPのマニュアルを読んでいて、型ジャグリングに出くわしました

私はそのようなことに出くわしたことがないので、私は混乱しました。

$foo = 5 + "10 Little Piggies"; // $foo is integer (15)

このコードを使用すると15が返され、合計で10 + 5になり、使用するis_int()とtrueが返されます。1私がエラーを予期していたところ、それは後で私がString conversion to numbers読んだ場所に私を参照しましたIf the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero)

$foo = 1 + "bob3";             /* $foo is int though this doesn't add up 3+1 
                                  but as stated this adds 1+0 */

string10個のLittlePiggiesまたはbob3をとしてではなく、として扱いたい場合はどうすればよいですかint。使用settype()も機能しません。文字列に5を追加できないというエラーが必要です。

4

2 に答える 2

4

エラーが必要な場合は、エラーをトリガーする必要があります。

$string = "bob3";
if (is_string($string)) 
{
    trigger_error('Does not work on a string.');
}
$foo = 1 + $string;

または、インターフェイスが必要な場合:

class IntegerAddition
{
    private $a, $b;
    public function __construct($a, $b) {
        if (!is_int($a)) throw new InvalidArgumentException('$a needs to be integer');
        if (!is_int($b)) throw new InvalidArgumentException('$b needs to be integer');
        $this->a = $a; $this->b = $b;
    }
    public function calculate() {
        return $this->a + $this->b;
    }
}

$add = new IntegerAddition(1, 'bob3');
echo $add->calculate();
于 2012-10-25T05:15:02.887 に答える
1

これは、PHPの動的型付けの性質と、もちろん明示的な型宣言要件の欠如の結果としての設計によるものです。変数タイプは、コンテキストに基づいて決定されます。

あなたの例に基づいて、あなたがするとき:

$a = 10;
$b = "10 Pigs";

$c = $a + $b // $c == (int) 20;

is_int($c)もちろん、PHPはステートメントの結果を整数に変換することを決定したため、呼び出しは常にブール値のtrueに評価されます。

インタプリタによるエラーを探している場合、これは言語に組み込まれているものであるため、エラーは発生しません。データ型をテストするには、多くの醜い条件付きコードを作成する必要があるかもしれません。

または、関数に渡された引数をテストするためにこれを実行したい場合(これは、これを実行したい場所について私が考えることができる唯一のシナリオです)、関数を呼び出しているクライアントが何をしているかを知ることを信頼できます。それ以外の場合、戻り値は未定義であると単純に文書化できます。

私は他のプラットフォームや言語から来ていることを知っていますが、それを受け入れるのは難しいかもしれませんが、PHPで書かれた多くの優れたライブラリが同じアプローチに従っていると信じています。

于 2012-10-25T05:24:23.943 に答える