1)- Какой порядок грамотнее из двух приведенных ниже? 2)- Как во втором примере грамотно перевернуть выражение (счас там стоит <=, но подозреваю что это не совсем так как нужно)? Код (PHP): if ($result->num_rows > 0) { ОСНОВНОЕ ДЕЙСТВИЕ } else { СООБЩЕНИЕ ОБ ОШИБКЕ } Код (PHP): if ($result->num_rows <= 0) { СООБЩЕНИЕ ОБ ОШИБКЕ } else { ОСНОВНОЕ ДЕЙСТВИЕ }
ты проверяешь есть ли в БД пользователь с таким логином и паролем, если есть у тебя $result->num_rows = 1 если нет, у тебя $result->num_rows = 0 выражение if ($result->num_rows <= 0) { ... в корне не верно, т.к. в обоих случаях будет выдавать true по этому only первый вариант.
просто я хочу в конце выводить основное действие, а до него всякие доп.проверки (как в примере 2), поэтому и вопрос: как правильно перевернуть условия (может знаком ! или еще как) Добавлено спустя 1 минуту 32 секунды: почему в обоих- там же не >= а <=. Прошу обратить внимание Добавлено спустя 1 минуту 19 секунд: т.е. вопрос больше касается оформления кода, а не логики
Да по барабану. Делай как по кайфу. Вот только, если количество строк равно нулю, то это не ошибка. Я бы сделал так: Код (PHP): if ($result->num_rows === 0) { // нет записей } else { // we go }
когда я писал сообщение там за место второго варианта было не пойми что, но все равно, значение $result->num_rows не может быть меньше 0, по этому зачем проверять меньше оно нуля или нет. Первый вариант правильнее. Я помниться когда то писал кучу вложений во вложениях типа: Код (PHP): if ( !empty($val) ) { if ($val > 0) { // ... } else { // ... } } else { // ... } а потом нашел выход попроще, создаешь функцию и пишешь так: Код (PHP): function check($val){ if ( empty($val) ) { return 'пусто'; } if ($val < 0) { return 'меньше нуля'; } return true; } например задача функции проверить полученную переменную на соответствие требованиям и если она соответствует вернуть true, если она не соответствует, то дело до true и из функции отправит раньше. И покороче и не утонешь в коде.
имхо, делать можно и так и так, главное что бы это правило (как и любые другие) соблюдались во всем коде. Код (PHP): if ($true) { //код } else { //код } з.ы. если ты озаботился правильным оформленим кода, то советую обратить внимание на PSR - http://www.php-fig.org/
Хм, а я читал про ифы другое правило - первым должен идти меньший по объёму блок, чтоб else не было скрыто за тремя страницами кода. ИМХО, разумно
Это правило придумали мракобесы ) Если блок разрастается на три страницы, то его нужно делить на составные куски.
Есть скрипты автоматического рецензирования кода, которые могут выдать заключение вроде "слишком большая вложенность блоков" или "слишком много строк в методе". Это не догма, конечно, но и не на пустом месте родилось. Код по мере распухания становится менее понятным. У меня есть такое личное правило: если один из вариантов if-else заканчивается прерыванием выполнения — return, exit() или break — я ставлю этот блок первым, а второй освобождаю от скобок. Код становится чуть чище и чуть короче. Вместо Код (PHP): if ($a > 0) { alfa(); beta(); } else { gama(); return; } делаю Код (PHP): if ($a <= 0) { gama(); return; } alfa(); beta(); Добавлено спустя 7 минут 41 секунду: Немного оффтопик: PHP Code Sniffer (phpcs) , можно запускать из командной строки или интегрировать с NetBeans и другими IDE. Содержит богатый набор стилистических правил. Как вариант, он может проверять на соответствие стандартам PSR.
artoodetoo, да, я тоже так люблю делать. Я вообще люблю и break, и continue, хоть это и скрытые goto по сути. По мне, так: Код (Text): while ($a = f()) { if ($a["str"] == "") continue; // 10-15 строк по обработке $a } читается лучше, чем Код (Text): while ($a != f()) { if ($a["str"] != "") { // 10-15 строк по обработке $a } }
Если вы пользуетесь исключениями, то лучше второй вариант, т.к. else вообще не нужен. Код (PHP): try { if ($result->num_rows <= 0) { throw new Exception; } ОСНОВНОЕ ДЕЙСТВИЕ } catch ($e) { СООБЩЕНИЕ ОБ ОШИБКЕ }
Все чтото городят - а var_dump() сложно было выложить. и условия. Если там не массив а объект? А если массив? Нет такого правильно и нет - нужно условие и то что результе... Тогда можно и чтото ответить.
Я делаю как artoodetoo. Считаю это проще читаемым. Еще и экскпшн можно заюзать. Если кидать через функцию, то вообще в одну строку.
соотв. я юзаю такие вот функции: Код (PHP): <?php /** * Просто кидает эксепшн. * @param String $message * @param Integer $number * @throws Exception */ function ThrowE($message='', $number=0) { throw new Exception($message, $number); } /** * Эта функция кидает эксепшн если вар равен true, соотв кидает его с меседжем и номером, как передали. * @param $var Проверяется на нестрогое равенство true и если да - кидается эксепшн. * @param string $message Текст сообщения в эксепшене. * @param int $number Номер эксепшена. * @return bool Всегда true. * @throws Exception */ function ThrowOnTrue($var, $message = '', $number = 0) { if ($var) { throw new Exception($message, $number); } return true; } /** * Эта функция кидает эксепшн если вар равен фалсу или нулл, соотв кидает его с меседжем и номером, как передали. * @param $var Проверяется на нестрогое равенство false и если да - кидается эксепшн. * @param string $message Текст сообщения в эксепшене. * @param int $number Номер эксепшена. * @return bool Всегда true. * @throws Exception */ function ThrowOnFalse($var, $message = '', $number = 0) { if (!$var) { throw new Exception($message, $number); } return true; } /** * Кидает эксепшн в случае, если переменная не является массивом, или массив пуст. * @param Array $array * @param string $message Текст сообщения в эксепшене. * @param int $number Номер эксепшена. * @return bool Всегда true. * @throws Exception */ function ThrowOnBadArray($array, $message = '', $number = 0) { if (!is_array($array) OR empty($array)) { throw new Exception($message, $number); } return true; } Которые дают такой вот простой код: Код (PHP): try { $id = (int)$id; $enabled = (int)$enabled; if ($enabled == 1) { //должно быть право на отмену задачи ThrowOnFalse(User::right('requests tasks cancel'), 'no right to cancel'); } ThrowOnFalse(BSMDB::query("UPDATE `requests_tasks` SET `enabled` = $enabled, `closed` = NOW(), `closed_by` = " . User::$id . " WHERE `id` = $id"), 'cant update'); $task = BSMDB::firstrow("SELECT * FROM `requests_tasks` WHERE `id` = $id"); ThrowOnFalse($task, 'no task'); $request = BSMDB::firstrow("SELECT * FROM `requests` WHERE `id` = {$task['request']}"); ThrowOnFalse($request, 'no request'); Requests::$managers = self::getManagers(); ThrowOnFalse(Requests::$managers, 'no managers'); ThrowOnFalse(self::refreshRequest($request['id']), 'refresh failed'); Requests::DrawRequest($request); } catch (Exception $exc) { echo 'ERROR: ' . $exc->getMessage(); } и никаких ифов вообще. каждая следующая строка возможна только если всё прошло гладко и всё что нужно для нее - есть.