2012-10-25 11 views
5
のint

として文字列を扱い、私はそのようなことに出くわしたことがありませんので、私は、type juggling文字列としてではなく、私はPHPマニュアル読んでいたPHP

私は混乱していたに出くわした方法。

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

私はそれは私に15を返します。このコードを使用すると、それは10 + 5を加算し、私はis_int()を使用する場合、それは私に本当のすなわちを返します。私は、エラーを期待していたところ1が、それは後で私がintとしてstringないとして10リトルPiggies OR bob3を扱いたい場合、私は何をすべき今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 */ 

を読んString conversion to numbersに私を参照しました。 settype()を使用しても動作しません。文字列に5を追加できないというエラーが欲しいです。

+0

-1質問に、真剣に?臆病者が来て、私に答えてください。どうして私の質問と回答を何の理由もなく連続して下降させるのはなぜですか? –

答えて

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(); 
+2

Voooooので、私はカスタムエラーをスローする必要がありますか? –

+1

@ Mr.Alien:必要なものに応じて、はい。 PHPは "string"可変型ではありません。そのタイプジャグリングについてです。 – hakre

+0

おそらく言葉のついた方がいいでしょう:PHPには、追加する型セーフな演算子はありません。 – hakre

1

これは、動的にPHPの結果として、仕様です型付きの性質を持ち、明示的な型宣言の要件が欠けています。変数の型はコンテキストに基づいて決定されます。あなたはあなたの例に基づいて

、:PHPは整数に文の結果を変換することを決定しましたので、

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

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

はもちろんのis_int($c)意志を呼び出すには、常にブール値trueに評価されます。

通訳者がエラーを探しているのなら、これは私が言及したように、言語に組み込まれているものなので、それを得ることはできません。あなたは、あなたのデータ型をテストするために多くの醜い条件付きコードを書かなければならないかもしれません。

あなたの関数に渡された引数をテストするためにそれを実行したい場合 - これはあなたがこれをやりたいと思う唯一のシナリオです - あなたの関数を呼び出すクライアントが自分が何であるかを知ることができますやってそうでなければ、戻り値は単に定義されていないと文書化することができます。

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

+0

詳細な説明をありがとう –

関連する問題