2017-04-20 13 views
0

現在、HTML、CSS、およびJSのバックグラウンドからPHPを学習しています。その結果、私は以下のコードを実験しました。return文の演算で予期しない動作が発生する

実験1:

書かれた時に算術ないレンダリング/削除される前に、return文は、次のようにすべてを書かれているようです。

コード:

<?php 
    function add($num, $num2) { 
     return $num."+".$num2." = ".$num + $num2."<br>"; 
    } 

    echo add(10, 7) . add(20, 1); 
?> 

出力

17<br> 
21<br> 


実験2:ただし

、私は変更$numから$num2までの最初の変数/パラメータは、最初の変数と+演算子の間のすべてが削除されているようです。

コード:

<?php 
    function add($num, $num2) { 
     return $num2."+".$num2." = ".$num + $num2."<br>"; 
    } 

    echo add(10, 7) . add(20, 1); 
?> 

出力

14<br> 
2<br> 


実験3:

後それはJSで、私は算術式の周りに括弧を入れて期待される結果を出力することに気付いた。

コード:

<?php 
    function add($num, $num2) { 
     return $num."+".$num2." = ".($num + $num2)."<br>"; 
    } 

    echo add(10, 7) . add(20, 1); 
?> 

出力

10+7 = 17<br> 
20+1 = 21<br> 


(また、問題を解決するだろう $sum変数を作ります) 210

質問:

私の質問は、式のまわりに角かっこを入れないことによって予期しない動作が起こる原因ですか?

答えて

2

表示されている動作は、「ジャグリング」の結果です。

PHPは厳密に型指定されていないため、必要に応じて文字列を整数として解釈することができます(またはその逆の場合も同様です)。したがって、データ型が変換され、注意を払わないと問題が発生する可能性があります。文字列のような整数や整数のような文字列を扱うと、他の多くの言語ではエラーが発生します。たとえば、JavaScriptには、型を明示的に変更するためにString.parseInt()があります。

何インタプリタがやっていることはおおよそ次のとおりである、ステップ・バイ・ステップ:

  1. $num - 値と整数を確立10
  2. 10."+" - 文字列

      で整数を連結
    • 現在の出力を文字列に変換し(10"10"になります)、プラス記号
    • 0123を追加します
    • 出力は今"10+"
  3. "10+".$num2です - 整数

    • で文字列を連結した文字列を整数に変換し、それが
    • 出力は今"10+7"
  4. "10+7"." = "ある
  5. 追加します - 2つの文字列を連結する
    • 出力は今"10+7 = "
  6. "10+7 = ".$numです - 整数
    • で文字列を連結した文字列を整数に変換し、それが
    • 出力は今"10+7 = 10
  7. "10+7 = 10" + $num2ある
  8. 追加します - 文字列と整数の間の算術演算
    • 文字列を整数に変換し、次の整数に加算します。
    • この場合、PHPは文字列を整数に変換すると、文字列の先頭から開始し、最初の数字以外の数字になるまで数字を返します。したがって、"10+7 = 10"は10を引き出してから+になり、停止します数字を探しています。
    • 出力は現在17です。
    17."<br>"
  9. - 整数の連結と列
    • 文字列に整数に変換し、<br>
    • 出力は今17<br>ある追加。参考のため

:タイプジャグリングの

+0

について説明したのと同じです。 PHPには、ニッキーピックから本物の問題に至るさまざまな理由があります。私のためにデータ型がとても緩やかであるという事実は、不平を言う真の問題であり、多くの人々を引き上げています。コードであなたの意図を明確にしてください。それはうまくいくはずです。ああ、ユニットテスト。あらゆる種類のシナリオをテストして、コードが期待通りのものかどうかを確認できます。 – stratedge

2

PHPは、あなたがこの$num."+".$num2." = ".$numを取ってこれを算術的にこのコードに追加したくないということを、どのように知っていますか?$num2."<br>"?かっこを使用して$num + $num2を先に実行させない限り、そうはなりません。最初の例で

:次いで10+7=10、および:

$num."+".$num2." = ".$num 

文字列に相当

$num2 

7に等しいです。

あなたがそれらを追加しようとすると+文字列10+7=10が整数10にキャストしなければならないにしてと7に添加した文字列<br>が連結であるあなたに17を与えます。

は括弧でPHP: String Conversion to Numbers

を参照してください:

$num."+".$num2." = ".($num + $num2)."<br>"; 

あなたは、文字列<br>と連結10+717)と連結した文字列10+7=を取得します。

+0

グレート説明。ここに[リンク](http:// php。net/manual/en/language.operators.precedence.php)。これは乗算がOPの期待通りに機能する理由を示していますが、追加はしません。 – jh1711

+0

'7 + 7' + 7。
= 7 + 7。 '
' = 14。 '
' = '14
'。 num2を2回使用しました。残りはAbraCadaverが – jh1711

関連する問題