PHPの条件付き文字列デザインの機能

Habréは、セキュリティで保護されたアプリケーションを作成するのにどの言語が適しているかについて頻繁に議論します。 PHPは、初心者デベロッパーがセキュリティホールにつながるミスを犯すように設計されていることがよく知られています。 このハブポストでは、文字列を操作する場合のifおよびswitchステートメントの比較演算の非論理的な動作について説明したいと思います。 経験豊富な開発者はこれらの機能を知っていますが、それでも1か所で収集することにしました。 この投稿は、開発者やPHPで働いており、他の言語でのプログラミングの経験がある開発者に役立つと思います。



真実は何ですか?

どの行が本当ですか? 例を考えてみましょう:

echo '"" is'。 ( ''? 'true': 'false')。 「\ n」;

echo '"0" is'。 ( '0'? 'True': 'false')。 「\ n」;

echo '"-0" is'。 ( '-0'? 'True': 'false')。 「\ n」;

echo '"0.0" is'。 ( '0.0'? 'True': 'false')。 「\ n」;

echo '"00" is'。 ( '00'? 'True': 'false')。 「\ n」;

echo '"A" is'。 ( 'A'? 'True': 'false')。 "\ n";次のものがあります: ""はfalseです

「0」は偽です

「-0」が真

「0.0」が真

「00」は本当です

「A」は本当です

したがって、文字列「0」を除き、空でない行はすべて真です。 この動作のロジックは私には明らかではありません。 実際には、ifステートメントを使用して、フォームフィールドが埋められているかどうかを頻繁にチェックします。たとえば、if(isset($ _ GET ['income'])&& $ _GET ['income']){...} 。 誤解を避けるため、次の形式のチェックを使用する必要があります。if(isset($ _ GET ['income'])&& strlen($ _ GET ['income'])){...}

文字列の比較

PHPには、2つの比較演算子==と===があります。 2番目の演算子は型と値の一致を比較し、最初の演算子は型変換を実行してから比較を実行します。 ==演算子の特性は、数値と文字列を比較するときに、文字列が数値に変換されることです。 文字列が数値ではない場合、数値0に変換されます。例を考えてみましょう:echo '"A" == 0 is'。 ( 'A' == 0? 'True': 'false')。 「\ n」;

echo '"A" === 0 is'。 ( 'A' === 0? 'True': 'false')。 「\ n」;

echo '"A" == 0.0 is'。 ( 'A' == 0? 'True': 'false')。 「\ n」;

echo '"A" === 0.0 is'。 ( 'A' === 0? 'True': 'false')。 "\ n";スクリプトの結果: "A" == 0はtrue

「A」=== 0はfalse

「A」== 0.0はtrue

“ A” === 0.0はfalseです。関数が引数として渡された文字列を指定された文字列と比較する場合、まず文字列が数値ではなく引数として渡されていることを確認する必要があります。 switchステートメントを検討するときに、例が後で示されます。



Switchステートメント

switchステートメントは、渡された値を指定された定数と比較することを期待しています。 phpのスイッチ実装の特徴は、==演算子を使用して比較を実行することです。つまり、型を比較しません。 例として、入力名を受け取って従業員の給与を返す架空の関数を考えてみましょう:<?Php

function get_salary($ name){

switch($ name){

ケース「ジョン」:

3400を返します。

休憩;

ケース「メリー」:

4600を返します。

休憩;

デフォルト:

0を返します。

}

}



echo "ジョンの給料は" get_salary(「ジョン」)。 「\ n」;

echo「メリーの給料は」。 get_salary(「メリー」)。 「\ n」;

echo「ピーターの給料は」。 get_salary(「ピーター」)。 「\ n」;

echo "0's salary is"。 get_salary(0)。 「\ n」;

?>スクリプト出力:ジョンの給与は3400です

メアリーの給料は4600です

ピーターの給料は0

0の給与は3400です。この例は、文字列値ではなく数値を渡すことにより、関数のセキュリティが侵害されることを示しています。 不要な使用から関数を保護するには、入力値の型を確認する必要があります。

function get_salary($ name){

if(!is_string($ name))return 0;

switch($ name){

ケース「ジョン」:

3400を返します。

休憩;

ケース「メリー」:

4600を返します。

休憩;

デフォルト:

0を返します。

}

}



echo "ジョンの給料は" get_salary(「ジョン」)。 「\ n」;

echo「メリーの給料は」。 get_salary(「メリー」)。 「\ n」;

echo「ピーターの給料は」。 get_salary(「ピーター」)。 「\ n」;

echo "0's salary is"。 get_salary(0)。 「\ n」;

?>スクリプト出力:ジョンの給与は3400です

メアリーの給料は4600です

ピーターの給料は0

0の給与は0です。そのため、一部の比較演算は直感に反して動作します。 警告された者は武装しています。



Krosspost webew.ruのPHPの文字列を使用した条件構造の機能



All Articles