3

PHPアプリケーション内で定数を構成変数として使用したいのですが、定数が(何らかの理由で)存在しない場合にのみ通知がスローされますが、それをエラー(または例外)にします。存在しない変数をエコーし​​ようとしたとき。

次のような定数値を取得するための別の関数を使用せずに、それは可能ですか?

echo $non_existing_variable; // Error
echo NON_EXISTING_CONSTANT; // Now also an error

少し探し回っていましたが、何も見つかりませんでした。

存在しない変数を使おうとすると、コードの実行がすぐに終了してエラーがスローされますが、定数を使用しないのはなぜですか?

4

8 に答える 8

11

私はそれで定義されたものを使用することをお勧めしますあなたは次のようなことをすることができるはずです

if (defined('CONSTANT')) {
    echo CONSTANT;
} else {
    throw new Exception('Undefined Constant.');
}

編集:

以下のコメントで述べたように、このメソッドを使用する代わりに、カスタムエラーハンドラーを使用することもできます。set_error_handlerを使用すると、通知をキャッチしてアクションを実行できるはずです。

于 2009-01-31T15:05:34.043 に答える
2

次のようなカスタムエラーハンドラを作成できます

  1. エラーが通知であったかどうかを確認します
  2. エラー文字列に「未定義のクラス定数」が含まれているかどうかを確認してください
  3. 両方のカウントでそうであれば、あなたの例外をスローします

これはあなたが望むものを手に入れるでしょう。このアプローチの問題は、すべてのエラーを処理する責任があることです。PHPのエラー処理は完全にバイパスされます。

別のアプローチは、構成クラスを定義し、その定数を使用することです。

class Config{
    const CONFIG_ONE = 42;
}
//will produce a fatal error 
if(Config::CONFIG_TWO){
   //...
}

通知の代わりに、致命的なエラーが発生しますが、これはより正しいようです。残念ながら、同様のハイジンクがないと致命的なエラーをキャッチすることはできません(マニュアルのset_error_handlerエントリのコメントを参照してください)。

最後のオプションは、私たちが始めたところからかなり離れたところにあり、値を保持するプライベートクラス変数を使用して構成シングルトンを作成することです。これにより、誰かが未定義の構成値にアクセスしようとしたときに何が起こるかをプログラムで完全に制御できますが、定数の利点は失われます。

于 2009-02-01T03:50:45.903 に答える
2

独自のエラー ハンドラを作成することもできます。詳細はこちら:

http://php.net/manual/en/errorfunc.examples.php

http://www.w3schools.com/php/php_error.asp

于 2009-02-01T20:12:44.347 に答える
1

すべてのエラー (レベルに関係なく) を例外に変換するエラー ハンドラをインストールすることをお勧めします。警告であろうと通知であろうと、コードにエラーがあってはなりません。

参照:エラーを例外として処理する - 最良の方法

于 2009-02-01T00:46:22.843 に答える
0

definedこの関数を使用して、指定された名前の定数があるかどうかを確認します。

于 2009-01-31T15:06:03.200 に答える
0

はい、定義された関数については知っていますが、定数が存在するかどうかを毎回チェックするのはかなりの作業なので、追加の関数を使用せずに、代わりにエラーまたは例外を自動的にスローする、ある種のphp設定またはトリックを探しています定数が存在しない場合の通知。

存在しない変数を使おうとすると、コードの実行がすぐに終了してエラーがスローされますが、定数を使用しないのはなぜですか?

これまでのところありがとう(-:

于 2009-01-31T15:22:03.527 に答える
0

同じクラス内にいる場合は、これを使用して定数にアクセスできます

self::CONSTANT

基本的にself::を追加します

別のクラスにいる場合は、クラス名を使用してアクセスします

EXAMPLE::CONSTANT
于 2020-10-03T21:27:18.060 に答える