Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
substr($source, 0, strlen($prefix)) == $prefix, то, например, я сразу увижу, что у строки $source проверяется наличие префикса $prefix, пусть и несколько громоздко. Если я увижу strpos($source, $prefix) === 0 или !strncasecmp($source, $prefix, strlen($prefix)), то мне придется чутка поднапрячься, чтобы увидеть то же самое (хотя в первом я это и так вижу, потому что часто использую, а второе понимаю, потому что тоже когда-то писал на Си). А вот если там будут стоять какие-то монструозные конструкции, работающие за «полтора такта» процессора и занимающие пять символов кода (или, наоборот, тридцать строк), но при этом настолько для меня неестественно используемые, то на расшифровку строки кода уйдет много больше времени (по сравнению с примерами выше).substr($source, 0, strlen($prefix)) == $prefix легче чем strpos($source, $prefix) === 0?boolean option1, option2;
...
option1 = (option1 && option2) || (!option1 && !option2);
//option1 = ! (option1 ^ option2);
error_reporting(E_ALL | E_STRICT);. Человека, который с ИТ знаком на уровне «обычного пользователя», все эти битовые премудрости скорее отпугнут, а профит от них далеко не очевиден, если, конечно, не расписывать $user_perm &= ~ U_DELETE; как кучу if'ов. А для новичка (а может и не только) вообще читабельней будет что-то вроде $user_perm['can_delete'] = FALSE;, а то и $user->disableDelete();define('U_READ', 1 << 0); // 0001
define('U_CREATE', 1 << 1); // 0010
define('U_EDIT', 1 << 2); // 0100
define('U_DELETE', 1 << 3); // 1000
define('U_ALL', U_READ | U_CREATE | U_EDIT | U_DELETE); // 1111
0x1, 0x2, 0x4, 0x8, 0x10, 0x20
<source>
Выглядит аккуратнее!$user_perm = U_READ;
if($user_perm & U_READ) // есть ли право чтения?
// 1 вариант
var_dump((bool)($user_perm & U_ALL)); //все права? - true - неправильная проверка
var_dump((bool)($user_perm & U_READ)); //чтение? - true
var_dump((bool)($user_perm & U_EDIT)); //редактирование? - false
// 2 вариант
var_dump(($user_perm & U_ALL) == U_ALL); //все права? - false - правильная проверка
var_dump(($user_perm & U_READ) == U_READ); //чтение? - true
var_dump(($user_perm & U_EDIT) == U_EDIT); //редактирование? - false
И далеко не все книги по нему начинаются с двоичного исчисления и битовых операций. Лично я не одной такой не видел, кажется. В лучшем случае вскользь упоминаются.
И да, я изучаю PHP уже лет 10, всё никак не изучу. Вот, вроде бы, только освоил фичи 5.3, а уже 5.4 на подходе с какими-то traits.
наряду с временными зонами и кодировками
Серьезно… если человек ставит битовые операции по сложности на один уровень с временными зонами и кодировками, то «Вон из профессии».
Это простительно для начинающих или неспециалистов, когда даже целочисленное деление ставится под сомнение, но не для человека, который серьезно занимается программированием (и/или получает за это зарплату).
Для большей наглядности рассмотрим в качестве примера, простую систему разграничения прав доступа к сайту.
define('U_EDIT', 0b0001000000000000);
define('U_EDIT', 1<<12);$this->_state |= self::FLAGS;
$this->_state &= ~self::FLAGS;
if($this->_state & self::FLAGS){}
if($this->_state & self::FLAGS == self::FLAGS){}
if($this->_state & ~self::FLAGS){}
if((($this->_state & self::FLAGS) & (($this->_state & self::FLAGS) - 1))){}
if (((0b10001000 & 0b00001111) & ((0b10001000 & 0b00001111) - 1))) {}
if ((0b00001000 & (0b00001000 - 1))) {}
if ((0b00001000 & 0b00000111)) {}
if (0b00000000) {}
if(!(($this->_state & self::FLAGS) & (($this->_state & self::FLAGS) - 1))){}
if (((0b10001010 & 0b00001111) & ((0b10001010 & 0b00001111) - 1))) {}
if ((0b00001010 & (0b00001010 - 1))) {}
if ((0b00001000 & 0b00001001)) {}
if (0b00001000) {}
Битовые операции в PHP на примерах