У меня есть этот метод, и вопрос в том, как я могу разбить эту очень длинную строку, чтобы она не превышала 85-120 символов? Для записи я не делал этот код сам, это старый проект с открытым исходным кодом, который я адаптировал под свои нужды.
function doQuery($sql)
{
$this->counter++;
$result = $this->unbuffered ? mysqli_query($this->db, $sql, MYSQLI_USE_RESULT) or $this->error = true and $this->errormessage = mysqli_error($this->db) : mysqli_query($this->db, $sql) or $this->error = true and $this->errormessage = mysqli_error($this->db);
return new ResultSet($result);
}
Вот оригинальный метод, мне пришлось настроить его для php 7, но, возможно, я облажался. Я не профессиональный программист, чисто хобби.
/**
* Query the database
*
* @param string sql query string
* @throws DatabaseException
* @return ResultSet
*/
function doQuery($sql) {
$this->counter++;
$result = $this->unbuffered ? @mysql_unbuffered_query($sql, $this->db) or $this->error = true and $this->errormessage = mysql_error() : @mysql_query($sql, $this->db) or $this->error = true and $this->errormessage = mysql_error();
return new ResultSet($result);
}
Я скорректировал первый метод, спасибо Биллу Карвину.
/**
* Query the database
*
* @param string $sql sql query string.
*
* @throws DatabaseException
*
* @return ResultSet.
*/
function doQuery($sql)
{
$this->counter++;
if ($this->unbuffered) {
$resultmode = MYSQLI_USE_RESULT;
} else {
$resultmode = MYSQLI_STORE_RESULT;
}
$result = mysqli_query($this->db, $sql, $resultmode);
// If anything goes wrong.
if ($result === false) {
$this->error = true;
$this->errormessage = mysqli_error($this->db);
}
return new ResultSet($result);
}
я использую стандарт кодирования груши. Итак, если я правильно понимаю, я могу разбить его на пробел, чтобы разделить длинную строку, например, на 4 строки?
Я не знаком со стандартными рекомендациями по грушевому кодированию. В общем, лучше всего прерываться на операции (в вашем случае я бы предложил на логических операторах).
Я бы избавился от всего метода. Эта функция является мусором, и вы никогда не должны использовать его. Вместо этого включите правильную отчетность об ошибках. Как получить сообщение об ошибке в MySQLi?
Я не шучу, но я, честно говоря, не понимаю, что должен делать этот код, и сомневаюсь, что он вообще работает. ИМХО, он должен генерировать исключение или давать действительно неправильные результаты. Возможно, если вы объясните причину этого метода, мы сможем предложить несколько лучших альтернатив.
Ну, если честно, я тоже этого не понимаю, я не делал этот код. это проект с открытым исходным кодом, который я модифицировал под свои нужды. он относительно старый, я несколько раз обновлял код. Хорошая новость в том, что это работает для моего личного использования, плохая новость в том, что я не понимаю таких частей, как $this->unbuffered или ? или : операторы. Итак, я понимаю, что с точки зрения кодирования это не имеет никакого смысла, как и сообщения об ошибках, но сейчас это не вопрос.
Тот, кто написал этот код, был слишком умен для своего же блага. Жестоко и безответственно писать такой код и передавать его другим. Это работает, но это излишне неясно.
Есть цитата Брайана Кернигана, которую важно помнить, когда вы программист:
«Все знают, что отладка в два раза сложнее, чем написание программы. Итак, если вы настолько умны, насколько это возможно, когда вы ее пишете, как вы вообще сможете ее отлаживать?»
Вот попытка кода, который работает так же, но более понятен:
function doQuery($sql)
{
$this->counter++;
if ($this->unbuffered) {
$resultmode = MYSQLI_USE_RESULT;
} else {
$resultmode = MYSQLI_STORE_RESULT;
}
$result = mysqli_query($this->db, $sql, $resultmode);
if ($result === false) {
$this->error = true;
$this->errormessage = mysqli_error($this->db);
}
return new ResultSet($result);
}
Обновлено: исправлена строка error = true
.
Конечно, я не тестировал этот код в вашем проекте. Так что если есть что-то, чего я не заметил в том, как работает другой код в проекте, я бы этого не знал. Если вы попробуете это, я рекомендую вам сначала сохранить копию вашего текущего кода, чтобы, если это не сработает, вы могли легко восстановить предыдущий код.
Объясняя некоторые раздражающие хитрости исходного кода.
Оператор ? :
похож на структуру if/then/else
, за исключением того, что вы можете использовать его как выражение. Другими словами, вы можете присвоить значение выражения другой переменной, в отличие от if/then/else
.
$var = (1 == 2) ? "yes" : "no";
Это работает следующим образом: оценивается первый экспресс (1 == 2)
. Если это правда, то результатом будет выражение после ?
. Если результат первого выражения ложный, то результатом является выражение после :
.
В этом примере переменной присваивается значение «нет».
Откровенно говоря, хотя этот формат кажется умным, чем больше я получаю опыта как программиста, тем реже мне нравится его использовать. Включение большего количества логики в одно выражение может сократить количество строк кода, но это усложняет отладку кода, его трудно изменить и на самом деле не делает его более быстрым, чем если бы вы прописали все это с помощью if/then/else
структур.
В этой части используется еще один прием:
mysqli_query($this->db, $sql, MYSQLI_USE_RESULT) or $this->error = true and $this->errormessage = mysqli_error($this->db)
Он основан на логическом коротком замыкании, что означает, что если вы пишете выражение вроде A OR B
, то сначала оценивается A
, а если оно истинно (или что-то вроде истинного), то B
не нужно оценивать, потому что true OR anything
в конечном итоге будет истинным в любом случае.
В этом случае mysqli_query()
вернет ресурс результата, который является своего рода «истинным» или, по крайней мере, не является буквально ложным. Но если в SQL-запросе ошибка, то mysqli_query()
однозначно возвращает false (так написано в документации ). Таким образом, то, что находится справа от or
в этом выражении, будет оцениваться только в том случае, если mysqli_query()
содержит ошибку.
Последний трюк заключается в том, что хотя =
является присваиванием (а не ==
, которое является сравнением на равенство), его можно использовать в выражении. Это означает, что выражение возвращает назначенное значение, но у выражения также есть побочный эффект, заключающийся в том, что оно присваивает значения переменным.
Таким образом, код, который вы унаследовали, использует тернарный оператор, логическое сокращение и побочные эффекты присваивания внутри выражений, и все это ради сомнительной цели — написать как можно больше логики в одной строке кода. Программисты, которые делают это, просто хвастаются, и они показывают, что их не заботят читабельность или ремонтопригодность кода.
Вы также спрашивали об этом в комментариях ниже:
isset($_GET["sort"]) ? $sort = $_GET["sort"] : $sort = "name";
Это также использует тернарный оператор. Это то же самое, что и следующее:
if (isset($_GET["sort"])) {
$sort = $_GET["sort"];
} else {
$sort = "name";
}
Этот пример тернарного оператора также можно было бы записать так:
$sort = isset($_GET["sort"]) ? $_GET["sort"] : "name";
Поскольку все значение троичного выражения является либо вторым, либо третьим выражением, вы можете один раз присвоить результат переменной.
Наконец, PHP ввел еще одно сокращенное обозначение, потому что такого рода задачи очень распространены.
$sort = $_GET["sort"] ?: "name";
Это означает, что если в массиве "sort"
есть ключ $_GET
, прочитайте его, но если ключа нет в массиве, вернитесь к значению "name"
.
Это то, что я действительно могу понять, спасибо! это имеет больше смысла, чем описанный выше метод
Я рад, что вы поняли, как это работает, еще раз спасибо!
Вас интересует какое-либо объяснение исходного кода, или вы так же счастливы забыть о нем? :-)
Все еще учусь каждый день, так что да, мне интересно! это ? и: своего рода краткий стиль для if else?
Другой вопрос: isset($_GET["sort"]) ? $sort = $_GET["сортировка"] : $sort = "имя"; я нашел это, и это немного объясняет: stackoverflow.com/questions/1506527/…
Большое спасибо за объяснение этого, это было даже хуже, чем я думал. Я собираюсь прочитать его несколько раз, чтобы действительно понять, что он говорит. Я согласен, что мне совсем не нравятся короткие тексты, их трудно понять, трудно поддерживать. если еще больше кода, но гораздо проще читать.
Да, если они связаны с первым вопросом, продолжайте. Если это новые вопросы, пожалуйста, создайте новый пост.
Еще одна вещь, касающаяся всего кода в одной строке, которая раздражает, когда вы являетесь профессиональным программистом, работающим в команде, заключается в том, что если что-то в коде меняется, это, очевидно, изменяет одну строку кода, в которой все реализовано. Это затрудняет отчет об изменениях с использованием стандартных инструментов для определения различий в коде.
Примите любой стандарт кодирования, какой пожелаете. Вы можете сломать его на любом пробеле или специальном символе.