2

使用しているPHPソフトウェアに変更を加えており、ユーザーがなどのカスタムエラーレポートレベルを入力できるようにしたいと考えていますE_ALL & ~E_NOTICE

問題は、それらが指定する値が文字列として保存されることです。したがって、error_reporting()関数でそれを参照できません。

とにかく、文字列を関数に必要な値に変換できerror_reporting()ますか?すでにconstant()関数を試しましたが、定数が見つからないと表示されます。

リアム

4

3 に答える 3

3

AFAIK、ここで機能しない主な理由constantは、文字列'E_ALL & ~E_NOTICE'が定数ではないためですが、2つの定数といくつかのビット演算子です。したがって、ここでできることは、eval関数を使用することです。しかし...注意してください、非常に注意してください。

別の方法は、文字列で使用されるすべての定数を取得することです。これには正規表現を使用できます。

$string = 'E_ALL & ~E_NOTICE';
$intval = 0;
preg_match_all('/[A-Z_]+/',$string, $constants);
//$constants looks like: array(array('E_ALL', 'E_NOTICE'))
foreach ($constants[0] as $key => $const)
{
    //either converts them to their value
    $constants[0][$key] = constant($const);
    //or replace them in the initial string
    //you can do this using preg_replace_callback, too of course
    $string = replace($const, constant($const), $string);
}

定数名をそれらの値に置き換えることを選択した場合は、少なくとも、もう少し安全な文字列をeval:に渡すことを確認できます。

$string = preg_replace('/[^0-9&!|\^]/','',$string);//remove anything that isn't a number or bitwise operator.
error_reporting(eval($string));

ただし、evalをまったく使用したくない場合はswitch、関数のどこかにaを記述してしまう可能性があります。それは私があなたのためにやりたいことではありません、あなたがそれにショットを与えたいのであれば少し:

//Get the constants
preg_match_all('/[A-Z_]/',$string,$constants);
//Get the bitwise operators
preg_match_all('[&|~^\s]', $string, $bitOps);

//eg:
$string= 'E_ALL& ~E_NOTICE ^FOOBAR';
//~~>
$constants = array( array ('E_ALL', 'E_NOTICE', 'FOOBAR'));
$bitops = array( array( ' & ~', ' ^'));//pay close attention to the spaces!

結論/私の意見:
なぜこれをすべて通過するのですか?それは遅く、高価で、安全ではありません。より安全で、より単純で、より簡単な解決策は、文字列の代わりにint値を格納することです。
クライアントにerror_reportingレベルを選択してもらい(理由がわかりません...)、を作成してselect、事前定義されたオプションをいくつか提供してください。

彼らに完全な制御を与えたい場合は、彼らが彼ら自身のiniファイルを使用できるようにしますが、率直に言って、あなたの目標は、で実行されるような方法でコードを書くことE_STRICT | E_ALLです。変更するインセンティブはあまりありませんerror_reporting...クライアントに独自のコードの実行を許可していて、警告やエラーが発生している場合は、抑制すべきではないこと
をクライアントに指摘してください。ただし、修正してください。 !!

于 2013-03-17T22:19:52.660 に答える
0

分割部分についてはわかりませんが、次のようなことができると思います。

$level = NULL;

// Modifications
$level = E_ALL;
$level &= ~E_NOTICE;

error_reporting($level);

また、条件を設定すると、変数に優先定数を追加できます。

于 2013-03-17T22:07:00.260 に答える
-1

あなたは単純に配列によってそれを行うことができます:

        $ string = "E_ALL";
        $ errorLevel = array( "E_ALL" => E_ALL、
                            "E_NOTICE" => E_NOTICE、
                            "E_ERROR" => E_ERROR、
                            "E_WARNING" => E_WARNING、
                            "E_PARSE" => E_PARSE);
        error_reporting($ errorLevel [$ string]);
于 2013-03-17T21:42:52.437 に答える