PHP: <? var_dump(E_ALL); // int(6143) var_dump(E_ALL | E_NOTICE); // int(6143) var_dump(E_ALL ^ E_NOTICE); // int(6135) var_dump(E_ALL & E_NOTICE); // int( 8 ) var_dump(E_ERROR | E_WARNING | E_PARSE); // int(7) var_dump(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); // int(15) var_dump(E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING); // int(55) Так вот - объясните, пожалуйста, кто знает, каким образом реализовано включение параметров в error_repporting и соединение нескольких в один и как это можно реализовывать в своих функциях. Желательно - на примере. Допустим, если взять обертку для строковых функций. В методе changeCase может быть первый параметр с тремя константами: Str::ALL, Str::FIRST, Str::TITLE и второй параметр с четырьмя константами: Str:OWN, Str::UP, Str:OWN_FORCED или Str::UP_FORCED. Например: Str::changeCase($string, Str::ALL, Str:OWN_FORCED); Можно ли сделать передачу параметров туда так: Str::changeCase($string, Str::ALL | Str:OWN | Str::FORCED); Str::changeCase($string, Str::TITLE | Str::UP); И если можно - то как? Желательно не воздушное описание: "Та там побитовое сравнение, че ж непонятного то?" - а детальное описание механизма действия этого ньюанса Интересует не данный определенный случай - интересует сама теория и жага знаний.
Ну ты же знаешь как никсовые права комбинируются? Ну так и там точно так же - E_ERROR = 1 = 0001 E_WARNING = 2 = 0010 E_PARSE = 4 = 0100 E_NOTICE = 8 = 1000 Соответственно, их комбинации даются побитовым «или», то бишь, устанавливаются те биты, которые установлены хотя бы в одном операнде. - E_ERROR | E_PARSE = 5 = 0101, E_PARSE | E_NOTICE = 12 = 1100 Примерно так.
Или можеш проверять на наличие в комбинации какого либо параметра с помощью побитного умножения "и": PHP: <?php $sERROR_VALUE = 12; if (E_NOTICE & $sERROR_VALUE) { echo 'E_NOTICE установлен'; } if (E_ERROR & $sERROR_VALUE) { echo 'E_ERROR установлен'; } //Результат //E_NOTICE установлен Тоесть получается: Код (Text): $sERROR_VALUE = 1100; E_NOTICE = 1000; result = 1000 != 0 == TRUE $sERROR_VALUE = 1100; E_ERROR = 0001; result = 0000 == 0 == FALSE Фактически в $sERROR_VALUE установлены E_NOTICE | E_PARSE
Точно, парни, спасибо. Вопрос еще такой. PHP: <?php $dec = 55; // int(55) $oct = 067; // int(55) $hex = 0x37; // int(55) // $bin = ???; // Как указать в двоичном виде?: 110111 ?>
мм а почему бы не использовать текстовые параметры и не мучиться с константами? my_function($str,"BLABLA_ON|FIFI_OFF")
Принимай и парси строку вида 2x110010100011. Пример: PHP: <? $bin = "2x110010100011" $abc->SetOffset($bin); ?> А переводить вручную (со сдвигом 4 бита).
А зачем? Всё равно в функцию значения передаются именами констант, а значения их можно и десятично задать.
Mr.M.I.T. ну, например, my_function не надо писать, примерно для таких значений: PHP: <?php define('ET_MAXLENGTH', 1); define('ET_STRIMM', 2); define('ET_BASE64ENCODE', 4); define('ET_MUSTMATCH', 8); define('ET_INT', 16); define('ET_FLOAT', 32); ...
неубедил, в моём варианте можно ввести тоже какой-нибудь общий параметр или если рассматривать вариант "пользовательских" хаков, тоже можно ввести константу какую-нибудь чёто типа define("E_ON_ALL","E_PAR1|E_PAR2"); my_function($str,E_ON_ALL) Зы. И не *баться с кодами
Mr.M.I.T., а проверять как будешь, что передан параметр какой-либо? С интами всё просто PHP: <?php define('B1', 1); define('B2', 2); function a($b) { if ($b & B1) { // ... } if ($b & B2) { // ... } } ну и другие операции. например удалить из параметров B2 PHP: <?php $b &= ~B2;
мм например PHP: if(in_array("B1",$opt)){ } .... или если преобразовать опции в ключи PHP: if($opt['B1']){ }
Посчитал.. Для констант можно ставить след значения, закономерность видна невооруженным взглядом: Код (Text): Hex: 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000 и так далее Oct: 01, 02, 04, 010, 020, 040, 0100, 0200, 0400, 01000, 02000, 04000, 010000 и так далее Так каждая константа будет принимать свой уникальный вид и это, имхо, намного красивее и легче, чем в десятичной системе счисления. (Кто по памяти посчитает до 2^30 в десятичной системе?) Комбинируется, тоже очень красиво, потому можно использовать обе системы счисления, абы не десятичную, чтобы константы имели красивый и удобочитаемый стиль. Предлагаю использовать "Восьмеричную", кроме случаев когда реально удобней будет "Шестнадцатиричная". Отступы в классах предлагаю делать пробелами перед числом, после равно, чтобы крайняя правая цифра у всех констант была на одном уровне Код (Text): // oct, восьмеричная FIRST = 040; SECOND = 01000; BOTH = 01040; // hex, шестнадцатиричная FIRST = 0x20; SECOND = 0x200; BOTH = 0x220; // dec, десятиричная FIRST = 32; SECOND = 512; BOTH = 544; // Так глянешь - и хз, что за число и что тут включено Спасибо всем высказавшимся.
TheShock Не сильно въехал... Один хер ты сравнивашь битовыми операндами. Или ты преобразования в строки имеешь в виду?
TheShock, ну, с одной стороны, удобно, а с другой - ты же не каждый день констаты считаешь, можно и десятичными задать, да и список обьвления констант можно из соседнего класса скопировать всегда. А так, да в восьмеричной особенно удобно.
флоппик, не удобно в десятичной, потому что нельзя делать связанные константы. как в том же еррор-репортинге: Код (Text): E_ALL = E_ERROR | E_WARNING | E_PARSE | E_NOTICE | ... | E_USER_DEPRECATED E_ALL: 32767 in PHP 6 30719 in PHP 5.3.x 6143 in PHP 5.2.x 2047 previously Но я смотрю на эти числа и я, извините, в душе не ебу, что они значат и почему 32767 круче, чем 30719 и почему бы тогда не влепить туда 2000000, раз чем больше - тем лучше. Вот будет класс, а в нем будет какая-то константа: SOMETHING = 52473. А ты: 1. Не можешь без мана понять, что она значит (какие константы включает) 2. Не можешь добавить или удалить к ней чтото по умолчанию при рефакторинге без калькулятора. С хекс и окс системой это менее накладно.