AFAIK, основная причина, почему constant
не работает для вас, потому что строка 'E_ALL & ~E_NOTICE'
не является константой, но это две константы и некоторые побитовые операторы. Итак, что вы можете здесь сделать, это использовать функцию 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
в функции где-нибудь. Это не то, что я чувствую, что делает для вас, немного, если вы хотите, чтобы дать ему шанс:
//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!
Заключение/Мое мнение:
Почему пройти через все это? Это медленно, это дорого и небезопасно. Более безопасное, простое и простое решение IMHO было бы для хранения значения int вместо строки.
Вы хотите, чтобы ваши клиенты выбирали уровень error_reporting
(я не понимаю, почему ...), почему бы не создать select
и предоставить им несколько предопределенных опций.
Если вы хотите дать им полный контроль, разрешите им использовать свой собственный ini-файл, но, откровенно говоря, ваша цель - написать свой код таким образом, чтобы он работал под E_STRICT | E_ALL
. Если вы это сделаете, у вас не так много стимулов для изменения error_reporting
...
Если вы разрешаете своим клиентам запускать собственный код, и он поднимает предупреждения или ошибки, укажите им, что им не следует подавлять , но исправьте их!
Зачем кому-то это нравится? – zerkms
это не описание.Есть шанс, что вы делаете что-то ужасно неправильно – zerkms
@LiamW - Я согласен с zerkms; это очень странная вещь, которую нужно делать. Я не могу представить себе случай использования, где было бы разумно. Единственная причина для отображения ошибок - помочь разработчикам, работающим на сайте. Как правило, поэтому в системе dev вы должны отображать все ошибки, а в живой системе вы должны скрыть их все. Чтобы отладить систему в реальном времени, вы действительно должны использовать журнал ошибок, но даже если у вас есть параметр для просмотра ошибок, это должен быть режим одиночного отладки, а не открытая возможность изменять основные флагов PHP, потому что который имеет надпись «дыра безопасности». – Spudley