@0314masaa

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Fatal error: Uncaught Error: Undefined constant

環境 

os:mac
vscode1.70.0
php8.1.8

解決したいこと

・数値を3つ引数として渡して、その数値の平均値を返す。
・また、引数が3つでない場合と引数が数値でない場合、エラーメッセージを返す。
上記の条件で作成した関数の条件分岐で、
「数字以外が入力されたらエラーメッセージをechoする」、
という部分で、上記のメッセージがechoされず、
Fatal error: Uncaught Error: Undefined constant...とエラーが出てしまいます。

発生している問題・エラー

Fatal error: Uncaught Error: Undefined constant "a" in /Users/mm/Desktop/work/myapp/Lesson08/index.php on line 27
Error: Undefined constant "a" in /Users/mm/Desktop/work/myapp/Lesson08/index.php on line 27

該当するソースコード

function average_calc(int $num){
  $args = func_get_args();
  $total_num=0;
  foreach ($args as $key => $val) {
    $total_num += $val;
  }
  $args_count = func_num_args(); 
    if($args_count == 3){
      if(preg_match('/[0-9]/',(int)$args,$matches)){
        echo "引数が3つ、かつ数値でした。</br>";
        return  $total_num/3;
      }elseif(preg_match('/[^0-9]/',$args,$matches)){
        echo "{$matches}</br>引数は3つでしたが、数値ではありません。";
      }else
      echo 'その他のerrorです。';
    }
    else
      echo "引数が3つ入力されていません。";
  }
echo average_calc(1,2,a);

自分で試したこと

エラーメッセージを見ても
echo average_calc(1,2,a);の行でaって打ってるからだよーとしか書いておらず解決方法がわかりません。
色々試したのですが、PHP8.0以降だとどうしても今回のエラーメッセージが出てしまうという記事も見ました。
もし宜しければご助言よろしくお願い致します。

0 likes

2Answer

echo average_calc(1,2,a);の行でaって打ってるからだよーとしか書いておらず解決方法がわかりません。

文字列の a を意図しているのでしょうか?
PHPで文字列を使う場合は'(シングルコーテーション)などで括ります。

echo average_calc(1,2,'a');

index.php on line 27

エラーメッセージには27行とありますが記載されているコードは20行しかないので、どの部分でエラーが発生しているのか分かりません。
記載のコードのどの部分にあたるのか分かりやすく示してください。
よく分からなければ抜粋せずに載せたほうが良いと思います。

0Like

Comments

  1. @0314masaa

    Questioner

    ご回答ありがとうございます。
    aは意図して打っております。
    また'a'に変えても条件分岐に引っかからず、
    ```
    Fatal error: Uncaught TypeError: Unsupported operand types: int + string in /Users/mm/Desktop/work/myapp/Lesson08/index.php on line 12
    ```
    とエラーが出ます。
    表記されていない7行は<?phpの行とコメントアウトの行なので、不必要かと思い載せておりません。
    分かりづらく申し訳ございません。
  2. 引数を足している処理で、数値と文字列の+が発生しているのでエラーが出ています。

    1. 0 + 1
    2. 1 + 2
    3. 3 + 'a' (ここでエラー)

    先に事前条件(この場合は3つの数値であること)を確認しましょう。
  3. @0314masaa

    Questioner

    はい、それは把握しております。
    事前条件は前提の上で、もし数字以外が入力された場合に、条件分岐のエラーメッセージ
    }elseif(preg_match('/[^0-9]/',$args,$matches)){
    echo "{$matches}</br>引数は3つでしたが、数値ではありません。";
    を出力したいと思っているのですが、Fatal error: Uncaught Error:が出てしまい、困っています。
    コーディングの部分を変えて、上記の
    echo "{$matches}</br>引数は3つでしたが、数値ではありません。";
    を出力するのは可能でしょうか?不可能でしょうか?
  4. わかりにくくてすいません。「先に事前条件を確認しましょう」というのは、そのチェックを先にしましょうということでした。
    次のコードは、2つの引数を足し算するaddメソッドの例です。

    ```php
    <?php
    function add($a, $b) {
    // 先に引数のチェックをする
    if (!is_int($a) || !is_int($b)) {
    throw new Exception('引数は整数ではありません。');
    }

    // 引数をチェックした後で計算をする(引数が整数であることが保証されている)
    return $a + $b;
    }

    try {
    echo sprintf("%d + %d = %d\n", 1, 2, add(1, 2)); // "1 + 2 = 3"
    echo sprintf("%d + %d = %d\n", 1, 'a', add(1, 'a')); // 引数が整数ではないので例外が発生する
    } catch (Exception $e) {
    echo $e->getMessage(); // "引数は整数ではありません。"
    }
    ```

    計算の前に引数のチェックをしています。
    引数が整数でない場合は例外が発生するようにしています。
    echoではなく例外を使っているのは、addメソッドに足し算だけをさせるためです。
    (メッセージを表示したり、足し算の結果以外を返したりさせない)
    参考になるでしょうか?

    https://www.php.net/manual/ja/language.exceptions.php
  5. @0314masaa

    Questioner

    ご回答ありがとうございます。
    @blue32a様のコメントとても参考になりました。
    try catchで例外エラーを拾うことで解決出来ました!!
    ありがとうございます!!

    あと、もう一つよろしいでしょうか?
    try catchを使用して、
    数値以外の値(文字)が入力された場合、任意のエラーメッセージを出力する事は出来たのですが、関数の引数がnull又は0の場合のエラーメッセージを出力する事が出来ません。
    下記の条件は間違っているでしょうか?

    function averageCalc($a, $b, $c){
    try {
    if(empty($a) ||empty($b) ||empty($c)){ //empty()で引数がnullか0か調べて、trueの場合下記のメッセージを出力。
    ※ここのエラーをcatchしてくれず下記のメッセージが出ません。。。
    throw new Exception('引数が3つ入力されていません。');
    }
    if(!is_numeric($a)){
    throw new Exception('引数1が数字ではありません。');
    }
    if(!is_numeric($b)){
    throw new Exception('引数2が数字ではありません。');
    }
    if(!is_numeric($c)){
    throw new Exception('引数3が数字ではありません。');
    }
    } catch(\Throwable $ex){
    echo $ex->getMessage();
    return;
    }
    $array = array($a,$b,$c);
    $array_args = implode($array); //配列要素を文字列に変換し、変数に代入
    $total = $a+$b+$c;
    if(func_num_args() == 3 && preg_match('/[0-9]/',$array_args)){
    echo "引数が3つ、かつ数値でした。</br>";
    return $total/3;
    }elseif(func_num_args() < 3 || func_num_args() > 3){  //引数が3つ以外の場合下記のメッセージを出力。
    echo "引数が3つではありません。</br>";
    return;
    }
    else echo "その他のエラーです。"; 
    }
  6. > 関数の引数がnull又は0の場合のエラーメッセージを出力する事が出来ません。
    > 下記の条件は間違っているでしょうか?

    averageCalcメソッドをどのように使っているかを示していただかないと回答できません。
    変数a, b, cがどのような値なのか分からないので・・・。

    まずは自分でデバックしてみましょう。
    原始的ですがechoやver_dumpメソッドなどで値を出力して、プログラムの動きを探ります。

未定義の定数を使用しているための例外でしょう。
作った関数を使わず例えば以下のように変更しても例外が出るでしょう。

//echo average_calc(1,2,a);
var_dump( 1, 2, a );

定数を使うには事前に定義する必要があります。以下のような感じで(一例です)。

define( 'a', 'hoge' );

関数の中ですが、そもそも以下の部分は引数が3つあったときに実行すれば良いので、記述するなら「引数が3つ、かつ数値でした。」の行の後でしょう。

$total_num=0;
foreach ($args as $key => $val) {
	$total_num += $val;
}
0Like

Your answer might help someone💌