私たちのほとんどが知っているように、PHPには弱い型付けがあります。そうでない人のために、PHP.netは次のように述べています。
PHPは、変数宣言で明示的な型定義を必要としません(またはサポートしません)。変数のタイプは、変数が使用されるコンテキストによって決まります。
好きでも嫌いでも、PHPはその場で変数を再キャストします。したがって、次のコードは有効です。
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHPでは、次のように変数を明示的にキャストすることもできます。
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
それはすべてクールです...しかし、私の人生にとって、これを行うための実用的な理由を考えることはできません。
Javaのような、それをサポートする言語での強い型付けの問題はありません。それは大丈夫で、私はそれを完全に理解しています。また、関数パラメーターの型ヒントを認識し、その有用性を完全に理解しています。
型キャストに関する問題は、上記の引用文で説明されています。PHPで型を自由に交換できる場合は、型を強制的にキャストした後でも可能です。また、操作で特定のタイプが必要な場合にオンザフライで実行できます。これにより、次のことが有効になります。
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
だからポイントは何ですか?
PHPでユーザー定義型キャストが理にかなっているこの理論的な例を見てみましょう。
- キャスト変数
$foo
をint
→ として強制します(int)$foo
。 - 変数に文字列値を保存しようとしました
$foo
。 - PHPは例外をスローします!! ←それは理にかなっています。突然、ユーザー定義型キャストの理由が存在します!
PHPが必要に応じて切り替えを行うという事実により、ユーザー定義型キャストのポイントが曖昧になります。たとえば、次の2つのコードサンプルは同等です。
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
もともとこの質問をしてから1年後、誰が実際の環境でタイプキャストを使用していると思いましたか?敬具。
要件は、レストランメニューのウェブサイトに金額を表示することでした。サイトの設計では、表示が次のようになるように、末尾のゼロを削除する必要がありました。
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
私が見つけた最良の方法は、変数をフロートとしてキャストすることでした。
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHPは、フロートの末尾のゼロを削除し、フロートを連結用の文字列として再キャストします。
(string)
キャストをしたいですか?
$intval.'bar'
例外を投げると言っている場合、私はまだ同意しません。どの言語でも例外はスローされません。(私が知っているすべての言語は、自動キャストまたはを実行します.toString()
)。あなたが$intval = $stringval
例外を投げると言っているなら、あなたは強く型付けされた言語について話している。私は失礼に聞こえるつもりはなかったので、すみません。それは、すべての開発者が慣れているものに反するもので、はるかに不便だと思います。