- Правила прописания грамотного кода на PHP
- Правила переноса строки
- Пробелы и табуляция
- Правила расстановки фигурных скобок
- Использование тернарного оператора «?:»
- Выражения
- Инструкции «if», «else», «while» и т.п.
- Сложные инструкции
- Форматирование массивов
- Пустые строки
- Именование переменных
- Комментарии
- SQL запросы
- Рекомендованные
- Вам также будет интересно
- Как сделать перенос строки по пробелу?
- 2 ответа 2
- Как сделать перенос строк в операторе echo? [дубликат]
- 5 ответов 5
Правила прописания грамотного кода на PHP
В программирование существуют правила, которые задают определенные нормы прописания исходного кода. Эти правила не обязательны, но они позволяют сделать код читаемым и понятным.
Когда вы работаете в крупной компании в которой по мимо вас есть еще несколько программистов, то вам приходится работать с чужим кодом. Для того чтобы чтение кода было удобным для всех, придумали «Правила прописания исходного кода».
В своих записях я не всегда придерживаюсь таких правил, по той причине, что мне не удобно это делать, так как я пишу записи в редакторе в котором нет возможности проставлять табуляции.
Правила переноса строки
Нужно стараться избегать строк длинной более 120 символов, так как многие компиляторы не переносят строки, и из-за этого многим приходится использовать ползунок, для чтения полной строки.
Если строка превышает этот размер, то нужно использовать правила переноса строки:
- переносить можно после запятой или перед оператором;
- переносимая строка должна быть сдвинута относительно верхней на один символ табуляции;
Пробелы и табуляция
Пробелы и табуляции несут разные функции. Для тех кто не знает, табуляция — это отступ, который выполняется нажатием на клавишу Tab и равен 8 пробелам. Табуляция, так же отличается тем, что в некоторых компиляторах она может регулироваться в настройках и вы можете указать нужную для вас длину отступов.
В каких случаях ставится табуляция:
- Используется при переносе строк (правило, выше)
- Используется для обозначения подчиненности.
В каких случаях ставится пробел:
- Один пробел используется в объявлении методов после запятой, но не перед скобками: TestMethod($a, $b, $c); Примеры неправильного использования:
- TestMethod($a,$b,$c);
- TestMethod( $a, $b, $c );
Правила расстановки фигурных скобок
Открывающая скобка должна ставиться под соответствующим оператором и на одном отступе с ним. Закрывающая скобка должна ставится под соответствующей открывающей.
Использование тернарного оператора «?:»
Условие следует заключать в скобки, тем самым отделяя его от остального кода. По возможности, действия, производимые по условию, должны быть простыми функциями. Если весь блок ветвления плохо читается, то стоит заменить его на if/else.
Пример: ((условие) ? funct1() : func2());
Выражения
Желательно, чтобы в каждой строчке присутствовало только одно выражение.
Пример. Неправильно писать так:
Инструкции «if», «else», «while» и т.п.
Допустимы два вида написания инструкций:
- если тела всех частей инструкции состоят не более чем из одного выражения, то инструкция может записываться в виде
if (условие) действие1; else действие2;
При написании инструкций должно строго применяться правило Форматирование подчиненности: тело инструкции должно быть сдвинуто на один символ табуляции вправо от самой инструкции. Фигурные скобки используются всегда, должны находиться на отдельных строках, на одном уровне с инструкцией.
Пример. Неправильно писать так:
if ($a == 0) $a = 10; else< $a = 5; $b = 10;>
if ($a == 0) < $a = 10; > else < $a = 5; $b = 10; >
Сложные инструкции
Сложные инструкции следует разбивать по строкам. Например,
if(COption::GetOptionString("main", "new_user_registration", "N")=="Y" && $_SERVER['REQUEST_METHOD']=='POST' && $TYPE=="REGISTRATION" && (!defined("ADMIN_SECTION") || ADMIN_SECTION!==true))
if (COption::GetOptionString(«main», «new_user_registration», «N») == «Y» && $_SERVER[‘REQUEST_METHOD’] == ‘POST’ && $TYPE == «REGISTRATION» && (!defined(«ADMIN_SECTION») || ADMIN_SECTION !== true))
Очень сложные инструкции рекомендуется разбивать на несколько более простых. Например,
if((!(defined("STATISTIC_ONLY") && STATISTIC_ONLY && substr($APPLICATION->GetCurPage(), 0, strlen(BX_ROOT."/admin/"))!=BX_ROOT."/admin/")) && COption::GetOptionString("main", "include_charset", "Y")=="Y" && strlen(LANG_CHARSET)>0)
$publicStatisticOnly = False; if (defined(«STATISTIC_ONLY») && STATISTIC_ONLY && substr($APPLICATION->GetCurPage(), 0, strlen(BX_ROOT.«/admin/»)) != BX_ROOT.«/admin/») < $publicStatisticOnly = True; > if (!$publicStatisticOnly && strlen(LANG_CHARSET) > 0 && COption::GetOptionString(«main», «include_charset», «Y») == «Y»)
if (!defined("STATISTIC_ONLY") || ! STATISTIC_ONLY || substr($APPLICATION->GetCurPage(), 0, strlen(BX_ROOT."/admin/")) == BX_ROOT."/admin/") < if (strlen(LANG_CHARSET) > 0 && COption::GetOptionString("main", "include_charset", "Y") == "Y") < >>
Форматирование массивов
Массивы, которые записываются в несколько строк, следует форматировать следующим образом:
$arFilter = array( "key1" => "value1", "key2" => array( "key21" => "value21", "key22" => "value22", ) );
Пустые строки
Пустые строки помогают разбивать код приложения на логические сегменты. Несколькими строками могут отделяться секции в исходном файле. Одной пустой строкой отделяются друг от друга методы и логические секции внутри метода для более удобного чтения.
Именование переменных
- Не используйте подчеркивание для отделения слов внутри идентификаторов, это удлиняет идентификаторы и затрудняет чтение.
- Старайтесь давать переменным, методам и пр. «говорящие» названия. Предпочтительно использовать имена, которые ясно и четко описывают предназначение и/или смысл сущности.
- Старайтесь делать имена идентификаторов как можно короче (но не в ущерб читабельности).
- Если в имени содержится аббревиатура, лучше вместо всех заглавных оставить только первую букву заглавной, а остальные написать строчными. Т.е. лучше задать имя getHtmlStatistic, а не getHTMLStatistic.
- Первое логическое слово должно начинаться с маленькой буквы, остальные логические слова — с большой. Имена переменных могут иметь префиксы, если требуется явно указать тип переменной: ar — для массивов, db — для наборов данных из базы и т.п. Пример: $testCounter , $userPassword .
- При именование функций и методов, каждое логическое слово должно начинаться с заглавной буквы (стиль Паскаль). Например: CountVariable, ChangeUserPassword.
Комментарии
Для пояснения назначения класса или метода необходимо размещать комментарий перед объявлением этого класса или метода. Следует добавлять комментарий о назначении классов и методов к каждому публичному классу или методу. Перед логическими секциями кода желательно добавлять комментарии о том, что данная секция будет делать. Комментарии должны быть только на английском языке.
SQL запросы
Каждая операция SELECT, FROM, WHERE, ORDER BY, GROUP BY, HAVING должна начинаться с новой строки. Правило переноса длинной строки такое же как в PHP — новая строка с табуляцией.
Если у вас есть вопросы, пишите их в нашей группе — https://vk.com/progtime
Вы так же можете разместить свой вопрос на нашем форуме, где другие программисты смогут вам помочь в решение вашей задачи — https://vk.com/prog_time
В ней мы делимся своим опытом с другими начинающими программистами, поэтому обязательно ответим на ваш вопрос.
Так же прокачивайте свои навыки на нашем канале — https://www.youtube.com/c/ProgTime
Рекомендованные
Вам также будет интересно
На этом всё!
Больше интересных статей в нашей группе — https://vk.com/progtime
Вы так же можете разместить свой вопрос на нашем форуме, где другие программисты смогут вам помочь в решение вашей задачи — https://vk.com/prog_time
Так же прокачивайте свои навыки на нашем канале — https://www.youtube.com/c/ProgTime- Написание материала для курса по разработке ботов на Telegram
- Разработка универсального парсера на PHP
Каждый переведённый донат, мотивирует на создание новых записей и уроков на YouTube
Как сделать перенос строки по пробелу?
Нужно сделать перенос строк (записывать в массив)по пробелу по заданному размеру длины строки. Пример:
$text = 'Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.'; class MyClass < public $output = array(); public function text($text, $string_length)< print_r($output); >> $obj = new MyClass(); $obj->text($text, 20);
Array ( [0] => Возвращает TRUE в [1] => случае успешного завершения [2] => или FALSE в случае возникновения [3] => ошибки. Если вызвана статически, [4] => возвращает объект класса DOMDocument [5] => или FALSE в случае возникновения )
class MyClass < public $output = array(); public function text($text, $string_length)< $i = 0; foreach(explode(' ', $text) as $val)< if(!empty($this->output[$i]))< if(iconv_strlen($this->output[$i], 'utf-8') < $string_length)< $this->output[$i] .= $val.' '; > else < ++$i; if(isset($this->output[$i]))output[$i] .= $val.' ';> > > else < $this->output[$i] = $val.' '; > > print_r($this->output); > > $obj = new MyClass(); $obj->text($text, 20);
Array ( [0] => Возвращает TRUE в [1] => успешного завершения [2] => FALSE в случае возникновения [3] => Если вызвана статически, [4] => объект класса DOMDocument [5] => FALSE в случае возникновения )
Пропадает начиная с array [1]. Т.е. должно быть: [0] => Возвращает TRUE в [1] => СЛУЧАЕ успешного А слово СЛУЧАЕ теряется и вместо него вставляется завершения Не претендую, что мой алгоритм лучший, но уже перепробовал несколько различных способов и этот вышел ближе всего к истине.
Посмотрите вот это: ru.stackoverflow.com/questions/464557/… — с небольшими изменениями можно использовать
Юрий, вы опубликовали много описаний меток, напрямую копируя содержимое из внешних источников. Так делать не нужно. Зайдите в чат: chat.stackexchange.com/rooms/22462/stack-overflow—
2 ответа 2
Довёл идеи автора до логического завершения.
- Вариант №1.
Конвертация строки в однобайтовую кодировку CP1251.
Корректный вызов функции wordwrap в CP1251.
Конверсия в исходную кодировку.
Распаковка готовой строки в массив.class MyClass < public $output = array(); public function text($text, $string_length)< $code_original = mb_detect_encoding($text); $text_cp1251 = mb_convert_encoding($text, "CP1251"); $wrap_cp1251 = wordwrap($text_cp1251, 20,"
"); $wrap_original = mb_convert_encoding($wrap_cp1251, $code_original, "CP1251"); $this->output = explode("
", $wrap_original); print(""); print_r($this->output); print("
"); > > $text = 'Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.'; $obj = new MyClass(); $obj->text($text, 20);
class MyClass < public $output = array(); public function text($text, $string_length)< foreach(explode(' ', $text) as $val)< $len = iconv_strlen($val, 'utf-8')+1; if(empty($sum_prev))< $sum_prev = $len; $out_prev = $val; continue; >if(($sum_prev += $len) < $string_length+2)< $out_prev .= (' '.$val); >else < array_push($this->output, $out_prev); $sum_prev = $len; $out_prev = $val; > > array_push($this->output, $out_prev); print("
"); print_r($this->output); print("
"); > > $text = 'Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.'; $obj = new MyClass(); $obj->text($text, 20);
Результаты совпали полностью:
Array ( [0] => Возвращает TRUE в [1] => случае успешного [2] => завершения или FALSE [3] => в случае [4] => возникновения [5] => ошибки. Если вызвана [6] => статически, [7] => возвращает объект [8] => класса DOMDocument [9] => или FALSE в случае [10] => возникновения [11] => ошибки. )
Как сделать перенос строк в операторе echo? [дубликат]
Как сделать перенос строк с помощью конструкции echo в php? \n — не работает, хоть и написан в мануале, работает только тег html
. Работаю в Win7 64x, xampp.5 ответов 5
Разметка HTML игнорирует переводы строк, за исключением предварительно форматированного текста.
Для переноса строки используйте тэг:
Эта особенность- базовая основа html. Нужно всегда помнить, что внутри текстовых узлов множество подряд следующих пробельных символов будет отображаться как один пробел.
Это поведение можно изменить, как указано выше тэгом pre , либо свойством css white-space: pre .
Подробная информация в справочнике: https://webref.ru/css/white-spaceДля конвертации переносов строк в видимые
в php есть специальная функция:$text = "Line 1\nLine 2\n"; echo nl2br($text); // Line 1
\nLine 2
\nДля тех кто будет читать этот текст через годы. Дополню немного. Нужно различать перевод строки как команду браузера, и перевод строки для оформления исходного текста. Вот про отображение ответили отлично. А про оформление исходного может возникнуть проблемка мелкая. ‘\n’ отобразит в исходнике именно \n т.е. два символа, а «\n» переведёт строку и код страницы будет писаться с новой строки. Пожалуйста самый очевидный пример:
Выведет в исходник в одну строчку все тэги. Что конечно работает, но коллега Вас проклянёт если будет смотреть код без вспомогательных средств. А вот:
аккуратненько разделит список на строчки.