2013-07-03 13 views
6

私はPHPが弱い型の言語であることを理解しています。私の質問は、バランスの取れた点で、PHPの変数を特定の型として初期化することがセキュリティや効率の問題を考慮して望ましいのでしょうか?あるいはこれは潮に対して不必要に水泳するでしょうか?特定initialisationsのPHPでの型キャスト - セキュリティと効率

例:

$name = (string) "PHP"; // string 
$pizzaToppings = array("tomato", "cheese", "pepperoni"); // array 
$angle = (integer) 60; // integer 

次の記事が助けたが、答えではない、私の質問している:あなたは、必要に応じてPHPはそれらを作るだろう、種類を心配べきではありません PHP Typecasting - Good or bad?

答えて

4

PHPは、常に値の「現在のタイプを」知っている必要があります。この「現在のタイプ」は、すべての値とともに使用されるメタデータ(列挙型)です。あなたは明らかにタイプで常にリテラル値を、使用して変数を初期化しているので、あなたのコード例で

は、キャストは無意味です:

$s = "foo"; 
echo is_string($s); // 1 

$s = (string)"foo"; 
echo is_string($s); // also 1 

同じ整数と配列のために行きます。

あり、変数の型は、あなたが一目で想像するより他のものになるだろう少なくとも一つのケースです:キャストを使用して$i整数になるだろう。この場合

$i = PHP_INT_MAX + 1; // or use something like 999999999999 
echo gettype($i); // "double"! 

が、それは希望また、その値を変更します。これは行方不明のキャストに起因するのではなく、数字はPHPでどのように扱われるかをのアーティファクトされないが、もちろん

$i = (int)(PHP_INT_MAX + 1); 
echo gettype($i); // "integer" 
echo $i; // a very large negative number -- what?!? 

。結論は明らかです:リテラルで初期化するときにキャストを使用することに意味がありません

タイプXとして使用する変数を、異なるタイプY(または未知のタイプ)の値で初期化する場合は、明示的なキャストを使用する理由があります。その変数は今後使用される予定です。しかし、利益を過大評価してはいけません。この情報は人間の消費のためだけのものです。変数を別の型として使用しようとすると、PHPは通常の型変換を自動的に行います。

+0

本当に素敵な答え+1 – Robert

0

計算するときに型を使用する必要があるときは、必要なときに希望の型にキャストする型として有効であるという3つの===(型固有の比較)を使用してそれらを検証します。

1 === 1 = true 
1 === "1" = false 
1 === true = false 
true === true = true 
false === false = true 
"hello" === "hello" = true 
etc... 

型鋳造

$numberofpizzas = $_POST['number']; 
$price = 16; 
$totalprice = $price * (int)$numberofpizzas 
+0

マイケルが、私は動的型付けを回避し、後でタイプをテストする必要性を回避したいです。私は、これをPHPに残すのではなく、自分で型を制御する方が好きです。しかし、これがボトルネックの原因になっているかどうかは不明です。 –

+0

これはリテラルで制御します。 PHPは、変数の型を定義できる言語ではありません。 .NETに移動するのが好きでない場合 – Robert

2

は、定義することで、各タイプの間で同じように動作しません。間違った値を防ぐために、プログラムのライフサイクル中に同じタイプを保持することをお勧めします。それは、変数の初期化を含む任意の目的のためにそれを使用する前に

$val = false // (int) $val => 0 
$val = 0.0010 // (int) $val => 0 

All types of test methods

+1

はい、私はそれぞれの変数を同じ型に保つのが好きなので、それらを特定の型に宣言しています。私は動的なタイピングを避けたい。 –

+0

これは非常に良い習慣です。しかし、PHPの変数の型を強制することはできません –

+0

処理前に型をチェックするis_intまたはis_floatメソッドがあります –

0

特定の関数は、 "混在した"データ型を返します。つまり、失敗の場合は論理値 "false"を返し、有効な戻り値の場合は整数 "0"を返します。

戻り値をチェックするときに、正しい結果を得るために===コンパクションを使用する必要があることがあります。

この例を見てみましょう:

$s = 'Test'; 
$c = strpos($s, 'T'); 
// The letter 'T' is at the first position, at index 0 

if (false == $c) ... // evaluates to "true" because of the weak type comparsion of "0" and "false" 

if (false === $c) ... // evaluates to "false"