まず一番上の変数。php7からは便利な書き方が紹介されました。
$number1 = $_GET['number1'] ?? 0;
$number2 = $_GET['number2'] ?? 0;
$operator = $_GET['operator'] ?? '';
??の意味は、左にある値はnullと等しければ、右の値になる。なので、GETの値は何もなければ、つまり何も入力されてない時は、右の値が代入されます。if文の機能と同じですが、短い書き方と解釈してください。
でも文字などの入力をどうやって防ぐの?
$number1 = floatval($number1);
$number2 = floatval($number2);
floatvalっていう関数を使います。それは何かというと、入れられた値を、floatの形に変えます。つまりいたずらで文字を入れても、それをこの関数で変えられて、想定通りにプログラムが動きます。
つまり問題/エラーを隠すんじゃなくて、処理する。
この書き方だと、switch文に入ってるresult変数から@を消していいです。
もう一つは、割り算に関しては、number2には0が入る時の処理をしなければならない。数学的には現在無理な計算ですので、自分のエラーメッセージを出さなければなりません。
case 'divide':
if (0 == $number2) {
$result = '0の割り算は不可能です!';
} else {
$result = $number1 / $number2;
}
break;
こうすれば、計算処理が実行されず、エラーを防ぎました。もし@$resultにしておいて、数字2に0の値を入れたら、なんもエラーも表示されず、何が裏で起こってるかはわからないなので、デバッグができません。
でも@を使うのは必ずしもダメではありません。どんな処理をしてもしつこく出るメッセージはありますので、場合によりますが、使うことがあるんじゃないでしょうか。でも大事なのは、エラーメッセージを隠すではなく、エラーを防ぐ、もしくは処理すること。
Happy coding!