使用しているPHPソフトウェアに変更を加えており、ユーザーがなどのカスタムエラーレポートレベルを入力できるようにしたいと考えていますE_ALL & ~E_NOTICE
。
問題は、それらが指定する値が文字列として保存されることです。したがって、error_reporting()
関数でそれを参照できません。
とにかく、文字列を関数に必要な値に変換できerror_reporting()
ますか?すでにconstant()
関数を試しましたが、定数が見つからないと表示されます。
リアム
使用しているPHPソフトウェアに変更を加えており、ユーザーがなどのカスタムエラーレポートレベルを入力できるようにしたいと考えていますE_ALL & ~E_NOTICE
。
問題は、それらが指定する値が文字列として保存されることです。したがって、error_reporting()
関数でそれを参照できません。
とにかく、文字列を関数に必要な値に変換できerror_reporting()
ますか?すでにconstant()
関数を試しましたが、定数が見つからないと表示されます。
リアム
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
...クライアントに独自のコードの実行を許可していて、警告やエラーが発生している場合は、抑制すべきではないこと
をクライアントに指摘してください。ただし、修正してください。 !!
分割部分についてはわかりませんが、次のようなことができると思います。
$level = NULL;
// Modifications
$level = E_ALL;
$level &= ~E_NOTICE;
error_reporting($level);
また、条件を設定すると、変数に優先定数を追加できます。
あなたは単純に配列によってそれを行うことができます:
$ 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]);