2014-01-14 3 views
2

Я уже давно укоренялся с PHP, но я наткнулся на что-то, что я не могу сделать из головы или хвоста. Это из сообщения, которое я нашел здесь (что, по-моему, было заблокировано), и я понимаю большую часть решения, но есть только одна часть, с которой я запутался.PHP Если оператор путаницы

if (($number & $error_number) == $number) 
    { 
    $error_description[ ] = $description; 
    } 

Я не совсем уверен, что здесь проверяют. Любая помощь приветствуется.

((Полный код))

<?php 

$error_number = 22527; //could also use ini_get('error_reporting') 
$error_description = array(); 
$error_codes = array(
    E_ERROR    => "E_ERROR", 
    E_WARNING   => "E_WARNING", 
    E_PARSE    => "E_PARSE", 
    E_NOTICE    => "E_NOTICE", 
    E_CORE_ERROR   => "E_CORE_ERROR", 
    E_CORE_WARNING  => "E_CORE_WARNING", 
    E_COMPILE_ERROR  => "E_COMPILE_ERROR", 
    E_COMPILE_WARNING => "E_COMPILE_WARNING", 
    E_USER_ERROR   => "E_USER_ERROR", 
    E_USER_WARNING  => "E_USER_WARNING", 
    E_USER_NOTICE  => "E_USER_NOTICE", 
    E_STRICT    => "E_STRICT", 
    E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR", 
    E_DEPRECATED   => "E_DEPRECATED", 
    E_USER_DEPRECATED => "E_USER_DEPRECATED", 
    E_ALL    => "E_ALL" 
); 
foreach($error_codes as $number => $description) 
{   
    if (($number & $error_number) == $number) 
    { 
     $error_description[ ] = $description; 
    } 
} 
echo sprintf(
    "error number %d corresponds to:<br>\n%s", 
    $error_number, 
    implode(" | ", $error_description) 
); 
?> 

Я понимаю, что ключ находится в массиве предопределенные константы PHP, но я не уверен, как это в прошлом, если оператор работает/что это оценки.

+0

http://www.php.net/manual/en/language.operators.bitwise.php – Rottingham

+0

То вроде как, используя бит маскирования. Если вы заметили функцию error_reporting (http://www.php.net/manual/en/function.error-reporting.php), вы ИЛИ (|) значения; в побитом мире OR означает «+»; – Gasim

+0

Поразрядные значения. См. Документацию по php. – makallio85

ответ

1

& - побитовый оператор И. Прочитайте, как работают побитовые логические операции here.

В этом случае первое число является так называемым битовым полем, что означает, что все биты представляют собой различную ошибку. Выполняя AND с маской соответствующих ошибок - если 0 результатов, ни один из запрошенных битов не был установлен, иначе один из них был.

5

Оператор & является Bitwise Operator, который, при использовании, будет возвращать значение с «бит», установленных в обеих переменных, в данном случае $number и $error_number.

Если текущий $error_number содержит биты $number, то он содержит эту ошибку (если это имеет смысл?).

Например (в двоичном коде):

0001 & 1000 = 0000 
0001 & 0111 = 0001 
0110 & 1111 = 0110 

Результаты показывают значения, где Существует множество бит (т.е. 1) в обоих значений, являющихся AND-е изд вместе.

Другой пример (с номерами ошибок):

$error_number = E_USER_DEPRECATED | E_WARNING | E_ERROR; 

if ($error_number & E_WARNING) echo 'E_WARNING'; // will output 
if ($error_number & E_PARSE) echo 'E_PARSE'; // will not output 
Смежные вопросы