Аналогия программирования в жизни или правильный скрипт сервера PHP


Содержание материала:

Введение в PHP

Что такое PHP?

PHP — язык создания сценариев, который давно перерос свое название. Дело в том, что PHP — это аббревиатура от слов Personal Home Page. Первая версия PHP была создана Расмусом Лердорфом в 1994 г. и представляла собой набор инструментов для отслеживания посетителей Web-страницы. Со временем PHP из набора инструментов превратился в полноценный язык программирования, а его название было изменено как рекурсивное образование PHP HyperText Preprocessor (препроцессор гипертекста PHP).

PHP — это серверный язык создания сценариев. Конструкции PHP, вставленные в HTML-текст, выполняются сервером при каждом посещении страницы. Результат их обработки вместе с обычным HTML-текстом передается браузеру.

В настоящее время основной версией PHP является седьмая.

Существуют два основных конкурента PHP: Active Server Pages (ASP) компании Microsoft и ColdFusion компании Allaire. По сравнению с ними PHP обладает рядом преимуществ, в числе которых:

  • Высокая производительность. PHP-программы работают быстрее, чем ASP.
  • Функциональность. Разработку PHP-программы можно отделить от собственно разработки Web-страницы, что упростит жизнь и программисту, и дизайнеру.
  • Цена. PHP абсолютно бесплатен.
  • Простота в использовании. Имеющие опыт программирования на распространенных языках найдут синтаксис PHP хорошо знакомым.
  • Переносимость. Один и тот же PHP-код можно использовать как в среде NT, так и на платформах UNIX.

Общие правила построения PHP-программы

PHP-программы состоят из простого текста, поэтому набирать их можно в любом текстовом редакторе. Популярные HTML-редакторы имеют встроенную поддержку для редактирования PHP-программ.

Расширение файлов PHP-программ по умолчанию в PHP4 — .php. На основании этого расширения сервер распознает файл как PHP-программу и запускает интерпретатор.

PHP-программа должна быть отделена от обычного HTML-текста. Существует четыре стиля обрамления PHP-кода:

Стиль Открывающий тег Закрывающий тег
Сокращенный
XML (стандартный)
ASP
SCRIPT (программный)

Из перечисленных тегов только стандартные и программные работают в любой конфигурации PHP.

Так выглядит простейший смешанный документ, состоящий из HTML-текста и PHP-кода:

Пример 1

Здесь содержится один PHP-оператор echo. Этот оператор передает строку-аргумент «А вот и PHP!
» в HTML-страницу, которую генерирует сервер. При этом тег
сделает свое дело, т.е. осуществит переход на новую строку.

Для разделения операторов (по аналогии с Си) используется точка с запятой.

Комментарии в PHP-программе могут быть трех стилей:

В одном документе можно чередовать HTML-текст и блоки PHP-операторов сколько угодно раз. При этом все переменные, функции и классы, определенные в первом блоке, будут доступны и в последующих блоках.

В примере 1 заменим вызов функции echo на вызов встроенной функции phpinfo( ), которая выдаст список параметров PHP-среды.

Пример 2

Выданная справка содержит большое количество разнообразной информации о среде PHP (обратите внимание на бегунок справа). Функция phpinfo() бывает весьма полезна при диагностировании поведения создаваемых PHP-программ.

Преимущества PHP программирования: почему бизнес выбирает PHP

В 2015 году языку программирования PHP исполнилось 20 лет. PHP был создан талантливым датским программистом Расмусом Лердорфом. И хотя релиз скриптового языка состоялся в далеком 1995, с течением времени его производительность значительно улучшилась. И даже сегодня, в эпоху роста и стремительного развития большого количества современных веб-технологий, PHP все же удерживает позиции. Кроме того, по прогнозам, PHP останется самым популярным языком программирования для разработки веб-приложений в ближайшие годы.

Несколько слов о языке программирования PHP. Это акроним, который расшифровывается как «препроцессор гипертекста». PHP представляет собой скриптовый язык с открытым исходным кодом, созданный для написания веб-приложений (скриптов и сценариев), которые выполняются на веб-серверах. PHP можно без труда вставить в любую HTML страницу, он не зависит от скорости компьютера пользователя или браузера. PHP полностью работает на стороне сервера.

Для каких целей PHP используют чаще всего?

Язык программирования PHP — отличный выбор, если нужно быстро создать прототип и разработать статический или динамический сайт. Самые популярные сферы деятельности, где используется PHP программирование — это стартапы, рекламные и медийные агенства, а также небольшие компании по разработке ПО.

Согласно Wappalyzer — приложению, которое позволяет определить используемые технологии на сайте, 82% всех сайтов в интернете сделаны на PHP, что отражено в диаграмме ниже:

И действительно, если рассматривать такие популярные социальные платформы, как Facebook, Flickr, Tumblr, Wikipedia и Digg, то они базируются на PHP. Поисковая система Yahoo!, а также сервис почтовых рассылок Mailchimp сделаны на PHP.

Некоторые популярные системы управления контентом, такие как WordPress, Drupal и Joomla также созданы на базе PHP. Согласно исследованиям в области веб-технологий, проводимым W3Techs, WordPress доминирует на рынке CMS систем и используется в 25% всех сайтов (данные на 8 ноября 2015).

Ключ к успеху и популярности PHP лежит в преимуществах, которые этот язык программирования предлагает как для разработчиков, которые считают его несложным в изучении и использовании, так и для конечных пользователей, которые верят в то, что сайт, написанные на PHP, более удобны в использовании.

Почему бизнес до сих пор выбирает веб-программирование на PHP?

1. Невысокие расходы на разработку

PHP имеет открытый исходный код и распространяется по GPL лицензии. Он позволяет довольно быстро создавать прототипы и готовые сайты. Существует большое сообщество программистов, которое работает с PHP и делится своим опытом: оказывает поддержку разработчикам и предоставляет большое количество полезной документации, размещенной в свободном доступе, инструкций и руководств по PHP программированию, шаблонов и примеров, а также скриптов и программ на PHP.

2. Быстрое создание Agile веб-приложений

Применение PHP фреймворков позволяет создавать веб-приложения в кратчайшие сроки. Он также делает приложения масштабируемыми и легко обслуживаемыми, позволяя им развиваться с течением времени. Вот список лучших PHP фреймворков, которые мы используем для этих целей: Laravel, CodeIgniter, CakePHP, Symphony, Zend Framework 2, Yii, etc.

3. Красс-платформенность

PHP совместим с большинством операционных систем, таких как Windows, Linux, Solaris, Mac OSX, etc. Он также поддерживает все серверы, лидирующие по количеству инсталляций (Apache, IIS, iPlanet, etc.).

4. Поддержка сайтов для бизеса любого типа

Бизнес-приложение или сайт на базе PHP, большой или маленький, может быть с легкостью разработан в условиях ограниченного времени и бюджета. Более продвинутое PHP программирование подразумевает создание CRM решений, интернет-магазинов, веб-сайтов с базами данных, и др.

PHP широко используется для разработки удобных веб-сайтов и привлечения качественной аудитории на ваш сайт, что в итоге ведет к повышению рентабельности инвестиций (ROI).

5. Простое расширение функциональности веб-сайта

Фунциональность вашего сайта можно легко расширить благодаря обилию расширений и библиотек, представленных в интернете в свободном доступе. Добавить кастомные расширения, созданные PHP разработчиками, также не составит труда.

Примечание: Создание надежных сайтов на PHP может быть непростой задачей, потому что код PHP, большей частью, пишется разработчиками с небольшим опытом в области компьютерной безопасности. Поэтому так важно, чтобы PHP программисты, которые разрабатывают ваш сайт, обладали необходимыми навыками для защиты сайта от хакерских атак.

Услуги по PHP программированию от XB Software

PHP приложения, разработанные компанией XB Software для различных сфер деятельности, представлены следующими решениями:

  • Системы управления ресурсами
  • Приложения для хранения данных
  • Интернет-магазины
  • Системы управления проектами
  • Приложения для управления и распространения медиа контента
  • Веб-порталы
  • Приложения для бронирования
  • CRM системы

См. показательные примеры кейсов, описывающих приложения, созданных на базе PHP, здесь.

Если вам нравятся наши приложения, рекомендуем рассмотреть услуги по PHP программированию, предлагаемые нашей компанией. Мы создаем отличные динамические веб-сайты с многофункциональным пользовательским интерфейсом. Напишите нам и мы свяжемся с вами для уточнения деталей.

20 вещей, которые отличают PHP-программиста от обезьянки

PHP — самый популярный язык для написания кода серверной части. Одной и той же цели на нем можно достичь несколькими путями: можно спроектировать красивую и легко поддерживаемую систему, а можно быстро слепить вместе куски кода со Stack Overflow, не забивая себе чересчур голову такими вещами, как правила проектирования и читаемость кода.

Конечно, даже если вы пока еще не гуру разработки, вы все равно захотите писать код, из-за которого окружающим не захочется плакать. Tproger вас выручит — в этой статье собрано 20 советов, каждый из которых поможет вам улучшить читаемость кода и за следование которым вам потом скажут спасибо. А в перспективе прилежное следование этим советам поможет вам стать ближе к статусу опытного и внимательно относящегося к деталям разработчика.

Используйте и прочие способы размещения в файле php-скриптов. Да, может быть, у вас все работает, а вот на другом сервере — не факт. На некоторых серверах короткие тэги вообще отключены. Не рискуйте, используйте только . И кстати, не ставьте закрывающий php-тег — это признак дурного тона. А еще закрывающий тэг в конце может привести к неожиданным проблемам, связанным со случайно поставленным пробелом или переводом строки в конце вывода.

Отделяйте файлы с параметрами

Нет ни одной достаточно веской причины, которая бы оправдала хранение настроек в одном файле со скриптом. Всегда создавайте отдельный файл и в самом начале скрипта его подключайте. Вы поймете, как это важно, когда вам придется редактировать кучу файлов из-за изменения одного параметра. Это ведь совсем несложно:

Комментарии — ваши друзья

Конечно, если вы спешите или набиваете код на волне вдохновения, становится как-то не до комментариев. Но код, написанный давно, понимать трудно — даже если писали его вы. Лучше помогите себе парой комментариев в ключевых местах, чтобы потом сократить время на понимание очередного скрипта.

Правда, просто? Еще стоит обратить внимание на PHPDoc.

Грамотно форматируйте код

Нет ничего хуже огромной стены кода, автор которого явно не знал о существовании кнопки Tab. Не спасут даже комментарии — отступы придумали для того, чтобы логически отделять друг от друга фрагменты кода. А использование или неиспользование отступов много говорит о вас как о программисте. Вот этот код отформатирован неправильно:

А вот это — тот же самый код, но с правильным форматированием:

Если вы хотите точно знать, какой способ форматирования кода правильный — почитайте PSR-ы.

Давайте переменным понятные имена

Конечно, к единому мнению по этому вопросу прийти нельзя. camelCase или under_score? Нужна ли Венгерская нотация? Важно здесь одно: раз и навсегда определитесь, что вам ближе. А даже если вам и захочется изменить стиль, то пожалуйста, не делайте это посреди проекта! Разные варианты именования переменных в одном проекте или, что еще хуже, в одном файле — это ужасно. И никаких магических чисел! Не поленитесь использовать константы.

Инициализируйте переменные

Конечно, PHP автоматически создает переменные при попытке к ним обратиться. Но вам не кажется, что пользоваться этой особенностью довольно рискованно? Хорошей практикой считается всегда инициализировать переменные еще перед первым использованием. Это сделает код понятнее и поможет убедиться, что вы не обращаетесь случайно к неинициализированной переменной.

Булева переменная ложна, иначе — истинна

Если вы проверяете какое-то условие и потом результат сравнения сохраняете в булевом значении, при инициализации переменной для результата (мы ведь всегда заранее инициализируем переменную, помните?) сначала присваивайте ей false . То есть вот так делать не надо:

Зачем это? Представьте, что вы проверяете данные перед запросом к базе. Если по какой-то причине блок if вдруг не выполнится, то значение переменной останется false — так вы подстрахуете себя от попадания в базу ошибочных данных. В коде порой приходится иметь дело с конфиденциальными данными, так что лучше сначала исходить из того, что все данные ошибочны, пока не доказано обратное. Это правило практически написано кровью.

Кстати, лучше проверять, являются ли данные такими, как надо нам, чем являются ли они такими, как нам не надо.

Используйте кавычки, когда обращаетесь к элементам массива

В коде разных разработчиков можно увидеть два варианта доступа к элементам ассоциативного массива:

Во время выполнения второго варианта PHP сначала попытается найти константу с именем marc . И только если такой не найдется, marc будет сконвертировано в строку и передано в таком виде. Лучше не думать о том, что может случиться, если вдруг такая константа будет существовать… Всегда ставьте кавычки, чтобы такого не происходило.

Используйте запятые, чтобы обратиться к нескольким строкам в одном вызове

Если вам надо, например, в одном вызове функции обратиться к значению переменной и к строке, лучше используйте запятые, а не точки. Почему? Точка — оператор конкатенации строк, эта операция будет выполняться медленнее. Доказательство.

Еще раз. Так надо:

echo «Hello, my name is «, $name;

А вот так — не надо:

echo «Hello, my name is » . $name;

Пользуйтесь тернарными операторами

Если у вас в коде какое-то очень простое сравнение, желательно использовать тернарный оператор, чтобы не растягивать простой код на несколько строк. Вот так может выглядеть ваш простой if :

Но можно записать его и так:

Обобщенно тернарный оператор работает следующим образом:

Используйте для сравнения с булевыми значениями строгое сравнение

Если вы проверяете переменную на true или false , используйте === , а не == , которое задействуется в остальных сравнениях. Строгое сравнение из трех знаков равенства сравнит еще и типы переменных.

Используйте инкремент и декремент

Если вам нужно просто увеличить или уменьшить на 1 значение переменной, ни к чему писать эту громоздкую конструкцию:

Куда лаконичнее такой вариант:

А главная прелесть этих операций — в том, что одновременно с ними можно выполнять еще какое-нибудь действие (например, if или while ). В зависимости от того, написано ли — или ++ до или после самого названия переменной, очередность операций изменяется.

Используйте сокращенные операторы присваивания

Если переменную надо увеличить или уменьшить на число, не равное 1, то и в этом случае код можно сократить. Например, у вас в коде может быть такое:

А используя сокращенные операторы, этот же код можно будет записать так:

Со строками, кстати, это тоже работает. Если понадобится присоединить к существующей строке какую-то часть, сделайте это так:

Создайте отдельную функцию для var_dump

Иногда бывает нужно во время активной отладки часто выводить прямо на страницу значение какой-то переменной. Конечно, лучше лишний раз так не делать, но если все-таки нужно, то имеет смысл себе помочь. Функция может выглядеть так:

Тэг pre используется, чтобы сделать значение более читаемым. Кстати, такое странное имя функции дано неслучайно — оно короткое, хоть и неочевидное. Набрать ее название будет быстро. Только потом не забудьте убрать эту функцию, когда будете подчищать код в конце разработки.

Но лучше всего забыть этот совет и научиться пользоваться XDebug.

Пользуйтесь константами

Если у вас есть переменная, значение которой изменять не стоит, имеет смысл использовать вместо нее константу. Константы можно использовать, чтобы хранить в них пути, сообщения об ошибках и так далее. Имя константам стоит давать капсом — так их будет просто отличить, и вы будете уверены, что вызываете то, что нужно.

Пользуйтесь $_GET и $_POST

$_REQUEST лучше не использовать. Четко разделяйте данные: $_GET — это параметры, переданные из адресной строки, $_POST — это, например, полученные из формы данные. И не вздумайте передавать в скрипт пароли, особенно незашифрованные, GET-запросом!

Пользователи могут руками заменить значения в адресной строке на любые произвольные и доставить вам немало хлопот.

Используйте объекты, а не функции

PHP — все-таки в том числе и объектно-ориентированный язык. Если вы работаете над большим проектом, сотни строк функционального кода вам точно быстро надоедят. А если вам нужно хранить множество однотипных параметров, то тем более задумайтесь об использовании соответствующего класса.

Вызывайте методы цепочками

Если вы подряд вызываете несколько методов одного объекта, имеет смысл сократить код, не выписывая каждый раз название этого объекта. Если есть вот такой класс:

… то обращаться к его методам можно так:

Чтобы лучше понять, как это работает и при каких обстоятельствах можно это пользоваться, почитайте статью.

Не повторяйте себя

Всегда оборачивайте в функцию код, который используете чаще одного-двух раз. Если этого не делать, проект распухнет и будет состоять из кучи однотипных строчек.

«Росбанк», Москва, до 60 000 ₽ (до налогов)

Язык Web-программирования — PHP (стр. 1 из 3)

МУНИЦИПАЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

«СРЕДНЯЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА №5»

Исследовательская работа на тему:

«Язык Web-программирования — PHP»

Педагог: Абдразакова А.К.

2.2. Работа с MySQL (сохранение данных в базе данных). …………………………11

2.3. Работа с MySQL (получение данных из базы данных).…………………………13

БИБЛИОГРАФИЧЕСКИЙ СПИСОК …………………………………………………. …16

PHP — язык программирования, используемый на стороне WEB-сервера для динамической генерации HTML-страниц. Об этом говорит и расшифровка его названия: PHP — Personal HyperText Processor.

PHP — один из немногих языков программирования, созданных специально для разработки веб-приложений. Поэтому он включает в себя все функции, необходимые именно для работы на веб-сервере, и при этом лишен избыточности, свойственной многим его конкурентам.

Очень приятная особенность PHP — то, что его команды включаются в обычные HTML-страницы с помощью специальных тегов, которые и заставляют PHP-машину выполнять на сервере нужные действия. Программам на PHP не нужны специальные CGI-директории с особыми правами доступа. Более того, на одной страничке можно произвольно чередовать «простой» HTML и PHP-код.

PHP не зависит от платформы. PHP прекрасно интегрируется во все популярные веб-серверы: Apacce и IIS, Zens и Netscape Enterprise Server, работает под Windows и OS/2, MacOS и практически всеми UNIX-подобными системами. Как следствие — PHP работает практически у всех хостеров, разрешающих собственные выполняемые скрипты.

Замечательная особенность PHP — его интегрированность практически со всеми современными интернет-технологиями. PHP поддерживает большинство современных веб-протоколов: IMAP, FTP, POP, XML, SNMP и другие. PHP прекрасно работает с базами данных. Трудно найти СУБД, поддержка которой не была бы реализована в PHP. MySQL и MS SQL Server, PostgreSQL и Oracle, Sybase и Interbase. Один только перечень баз данных, поддерживаемых PHP, займет, наверное, целый экран.

PHP включает в себя огромное количество встроенных функций: обработки строк и массивов, работы с файловой системой и с HTTP, электронной почтой, датой и временем, кириллицей и другими национальными алфавитами. Когда я впервые начал программировать на PHP, то был просто поражен обилием встроенных функций! Благодаря им многие алгоритмы, требующие в большинстве языков написания программного кода размером в несколько экранов, реализуются на PHP одной командой (точнее, вызовом одной функции).

Современные тенденции развития языков программирования не обошли стороной и PHP. Средства объектно-ориентированного программирования появились еще в PHP3. А в объектной модели PHP4 в полном объеме реализованы классические понятия объектно-ориентированного программирования: наследование, инкапсуляция и полиморфизм.

Все вышеизложенное позволяет без всякой натяжки назвать PHP безусловным лидером среди языков веб-программирования.

Цель исследования – Изучить и посмотреть примеры выполнения скриптов PHP

Объект исследования –Язык PHP, Базы данных MySQL.

Предмет исследования – функциональное значение и актуальность языка.

Гипотеза исследования состоит в том, что данный язык очень простой, легко интегрируется в HTML, в связке PHP+MySQL+HTML намного превосходит простой HTML.

Исходя из гипотезы, сформированы следующие задачи :

— изучить особенности и возможности языка PHP;

— сравнить функционал PHP и HTML;

— познакомиться с базами данных MySQL;

— обработать полученные результаты, сделать выводы.

Теоретической основой представленного материала являются исторические данные, представленные в справочниках, материал из интернета.

Методы исследования: в процессе проведения исследований применялись описание, анализ литературы по теме, изучение некоторых переменных.

Практическая значимость исследования : данный материал можно использовать учителям и учащимся для последующего, углубленного изучения данного языка.

Структура и содержание работы включают:

Вводную часть, в которой обоснован выбор и актуальность темы.

Глава 1. «Вступление в PHP и MySQL» содержит 6 разделов. В первом разделе идет объяснение, что такое PHP. Во втором описаны его возможности. В третьем разделе главы описывается история языка PHP. В четвертом — сказано почему стоит выбирать именно этот язык программирования. Пятый и шестой разделы посвящены информации о базах данных MySQL.

Глава 2. «Примеры использования PHP» состоит из 3 разделов. В первом разделепоказано как в PHP легко обрабатывать данные с HTML – форм. Во втором мы будем заносить информацию в базу данных. В третьем разделе будем получать информацию из баз данных.

Заключение содержит основные выводы по теме, подтверждающие выдвинутую гипотезу исследования.

Глава 1. Вступление в PHP и MySQL

PHP – это скрипт-язык (scripting language), встраиваемый в HTML, который интерпретируется и выполняется на сервере. Проще всего это показать на примере:

PHP: 20+ практик, которым стоит следовать

Эта статья постарается научить вас нескольким лучшим практикам одного из самых популярных языков программирования в мире. Проблема в том, что многие разработчики, не только начинающие, но даже опытные PHP программисты, не уделяют им должного внимания.

Не так редки случаи, когда люди теряли высокооплачиваемую работу только потому, что не заостряли свое внимание на особенностях языка. Помните, что довольно сложно разобраться во всем за одну ночь.

Итак, если вы хотите стать профессиональным разработчиком , вы должны понимать особенности языка и использовать их в каждой новой написанной строчке кода.

1. Комментируйте свой код

Комментирование намного важнее, чем вы могли подумать. Очень грустно видеть начинающих разработчиков, да и закалённых программеров, которые не комментируют свой код просто потому что им лень.

Комментарии не только позволяют другим разработчикам понять ваш код, но и помогут разобраться вам самим, если придется вернуться к нему спустя какое-то время. Допустим, сегодня вы написали критически-важную функцию, и вы помните как она работает спустя день, два или даже неделю. Но, скорее всего, вы забудете о ней через пару месяцев.

Комментирование сделает ваш код понятным каждому (даже самим себе).

2. Используйте стандарты оформления кода

Стандартов оформления кода необходимость придерживаться (см. PSR-2, прим. пер.). Если разработчики в одном проекте будут использовать разные стандарты, репозиторий может превратиться в сущий ад.

Исходный код может стать абсолютно не поддерживаемым, если каждый, работая над ним, будет изобретать свой собственный стандарт оформления. Есть даже разработчики, которые не потрудились придерживаться хоть какого-нибудь стандарта, их код начал выглядеть как большая куча мусора и не более того.

Строгое следование определенному стандарту в оформлении кода даёт возможность другим программистам провести отладку вашего кода, и позволит вам самим присоединиться к сторонним проектам.

3. Никогда не используйте короткие теги

Есть много программистов, которые, я не знаю почему, пытаются придерживаться кротчайшего пути в объявлении PHP кода. Использование » вы должны использовать короткую запись вместо тега » » .

Это простое злоупотребление может стать причиной конфликтов с xml парсерами, а также может сделать ваш код несовместимым с будущими версиями PHP.

4. Используйте осмысленные названия переменных и функций

Если вы не применяете стандарты присвоения имен переменных, а используете общие и ничего не значащие имена, это может стать болезненным опытом для программистов, разбирающихся в вашем коде. Это очень плохая тенденция, которой ни в коем случае не стоит придерживаться.

Всегда пытайтесь использовать значимые и грамматически верные имена, а также заведите себе хорошую привычку разделять слова нижним подчеркиванием (автор имеет в виду Snake_case, что довольно странно, т.к. в PSR-2 используется CamelCase, прим. пер.). И, конечно, соответствуйте выбранному стандарту , чтобы другие люди смогли быстро и просто понять ваши обозначения.

5. Отступы и длина строк

Я уже говорил о важности следования стандарту оформления кода, но отдельно стоит сказать про отступы и длину строк.

Всегда используйте 4 пробела. Никогда не используйте Tab , потому что на разных компьютерах он может отображаться по-разному. Также старайтесь не выходить за пределы 80-и символов в длине строки, это сделает ваш код более читаемым.

Главная идея здесь — ваш код должен быть чистым, легко читаемым и отлаживаемым вами или другими программистами.

6. Одинарные или двойные кавычки

Вы должны понимать разницу между одинарными и двойными кавычками. Если вам нужно просто вывести на экран строку — используйте одинарные кавычки.

Но если вам нужно использовать переменные или спец символы ( «n», «t» ) , воспользуйтесь двойными кавычками. Это заставит PHP интерпретатор искать в строке управляющие последовательности, помните только, что это может занять больше процессорного времени.

Запомните разницу в их работе и используйте должным образом.

7. Никогда не используйте функции внутри циклов

Я видел множество программистов, которые допускают эту ошибку. Если вы делаете это намеренно и готовы пожертвовать производительностью ради сокращения кода на пару строк , предлагаю еще раз подумать об этом.

Так делать плохо:

Так делать хорошо:

Если вы возьмете на себя бремя хранения значения функции в отдельной переменной до цикла, вы сможете сэкономить довольно много времени выполнения. Во втором случае функция выполняется всего раз, а в первом — каждый раз при прохождении цикла. В программах с большими циклами это может быть очень существенно.

8. Используйте одинарные кавычки в индексах массивов

Есть разница между $array[‘quotes’] и $array[quotes], и вы должны понять её.

Особенность PHP в том, что он воспринимает индексы без кавычек как константы, и, если эти константы не были объявлены ранее, они будут самоопределены (self-defined), что вызовет предупреждение (warning). Это не остановит выполнение кода, но ошибка есть ошибка.

9. Лучший способ вывода строк

Взгляните на кусок кода, представленный ниже, и попробуйте догадаться, какое выражение выполнится быстрее, а какое окажется медленнее.

Представьте, но последняя запись, та, которую реже всего можно встретить в коде, выигрывает в тестах производительности. Первая запись, очевидно, проигрывает, потому что функция «print» работает медленнее, чем «echo». Третья строка выигрывает у второй за счет того, что операция конкатенации обрабатывается быстрее, чем переменные внутри строки.

Малоизвестный четвертый вариант побеждает, потому что в нем нет операций работы со строками, а всего лишь список строк, разделенных запятыми.

10. Включайте вывод ошибок (Error Reporting) в процессе разработки

В PHP есть очень полезная функция, error_reporting(), которая может помочь найти различные проблемы в вашем приложении.

Довольно часто встречаются ошибки, которые не останавливают выполнение программы, но они — потенциальные баги, которые обитают в вашем коде. Вы, как профессиональный разработчик, должны стремиться писать программы, свободные от любых ошибок.

PHP поддерживает несколько уровней показа ошибок: E_NOTICE, E_WARNING, E_PARSE и тд., но вы должны использовать E_ALL для вывода всех типов уведомлений. Не забудьте выключить показ ошибок, когда закончите работу над кодом, чтобы пользователи не испугались невразумительных сообщений.

11. Не забывайте о принципе DRY

DRY или Don’t Repeat Yourself (не повторяйся) — это концепция проектирования программного обеспечения, которая позволяет избавиться от избыточности в своем коде.

Это концепция применима не только к PHP, но и к любому другому языку программирования, таким как Java, C++ и тд. Простой пример кода позволит вам понять принцип DRY.

После применения принципа DRY, код будет выглядеть так:

12. Избегайте излишнюю вложенность

Постарайтесь избежать вложенность в вашем коде, на сколько это возможно. Иначе отладка может стать действительно трудным занятием , а также доведет до белого каления человека, делающего review вашего кода.

Используйте условные операторы таким образом, чтобы избежать множественного вложения. Это не только очень плохая практика, но и выставит ваше код в неудобном свете перед другими разработчиками.

13. Никогда не кладите phpinfo() в корневую директорию

Если вам нужно узнать детальную информацию о сервере, phpinfo() — очень удобное средство. Вам нужно всего лишь создать PHP файл:

Вы всего лишь размещаете файл на вашем сервере и получаете исчерпывающую информацию. Но множество разработчиков допускают ошибку, помещая файл в корневую директорию, т.к. это может открыть множество лазеек для хакеров.

Лучшим вариантом будет удалить файл, как только вы закончите с ним. Не так уж и страшно потратить пару секунд, если он понадобится вам снова.

14. Сделайте документацию по PHP вашим лучшим другом

Одна из лучших черт PHP — хорошая документация. Просто перейдите на htttp://php.net, и вы получите исчерпывающую информацию, по любому вопросу, который может у вас возникнуть, в достойно оформленном виде.

У них есть новый дизайн (в бэта версии), если хотите. Другой полезной чертой документации PHP являются крайне полезные комментарии.

15. Время использовать IDE

IDE расшифровывается как Integrated Development Environment (интегрированная среда разработки). Она может существенно облегчить процесс разработки. IDE обладает такими крутыми штуками как: Подсветка синтаксиса, Автодополнение кода, Навигация, Отладка и др., что сделает вас намного продуктивнее и поможет вам писать хороший код с минимумом ошибок.

Вот несколько IDE для PHP: NetBeans, phpDesigner, phpStormи т.д. Выбери то, что больше понравится.


16. Попробуйте PHP фреймворки

Если вы изучили основы PHP, значит самое время перейти к фреймворкам. Их для PHP целые десятки, большинство из них основано на модели MVC (Model-View-Controller).

Из них вы подчерпнете много новых интересных вещей для изучения. CakePHP, CodeIgniter, Zend, Symphony позволят вам создать потрясающие приложения на PHP.

17. Запускайте PHP локально

Если вы работаете над PHP приложением, то вам хотелось бы вести весь процесс разработки на своем компьютере, без подключения к удаленному серверу.

Для этого вам нужны лишь веб-сервер Apache и PHP. Если появится необходимость в базе данных, воспользуйтесь MySQL.

Конечно, вы можете установить их раздельно, но лучше будет воспользоваться готовым решением: XAMPP, WAMP, MAMP. Они очень просты в настройке и позволят развернуть локальный сервер за считанные минуты.

18. ООП

Концепция объектно-ориентированного программирования впервые была представлена в PHP 4, но полноценная его поддержка появилась в PHP 5.

Существует два типа языков программирования — процедурные и объектно-ориентированные. Первая написанная вами программа была, должно быть, процедурной.

Но сейчас самое время перейти к объектно-ориентированному программированию, поскольку оно обеспечивает более высокий уровень гибкости и может значительно сократить размер исходного кода. Ваш код станет выглядеть намного более организованным.

19. Обновляйте PHP

Это очевидный пункт, но множество программистов неохотно берутся за обновление. Вместе с новой версией мы можете получить улучшение производительности и новые возможности. Нет абсолютно ни единой причины, пропускать обновления.

Эти новые возможности могут сделать вашу программистскую жизнь намного интереснее и проще. И не стоит забывать, что в новых версиях появляются исправления багов и улучшения, связанные с безопасностью.

20. Взаимодействуйте с другими разработчиками

Один из простейших способов изучить что-то новое — чаще коммуницировать с другими людьми. Большинство людей неохотно признают, что они не очень-то сильны в той или иной сфере и нуждаются в помощи.

Но если вы будете думать также, то перекроете себе путь в мир изучения новых замечательных технологий.

Спрашивайте ваших друзей или опытных разработчиков на всевозможных форумах, таких как Stack Overflow, Dream In Code и т.п. В мире много людей, которые всегда готовы протянуть вам руку помощи.

Программирование на языке PHP для чайников. Часть 1

Предлагаю вашему вниманию краткое руководство по языку PHP для чайников в нескольких частях. Гарантирую, написать свой первый рабочий PHP код вы сможете уже после прочтения этой серии статей (или в процессе чтения). Язык PHP один из самых простых в освоении языков программирования, это серверный (исполняется на стороне сервера) язык сценариев (интерпретируемый язык).

Используется он для создания веб-проектов. Может использоваться прямо в HTML коде. И хотя результат работы скрипта часто выводится непосредственно в браузере клиента, для работы PHP не достаточно только одного браузера. То-есть вам не получится запустить index.php файл прямо в браузере, как вы уже наверняка делали с файлом index.html. Для работы PHP сценариев и веб-страниц созданных с применением PHP потребуется веб-сервер.

Если у вас еще нет хостинг площадки для вашего сайта, тогда рекомендую поэкспериментировать с PHP сценариями на локальном сервере, предназначенном для тестирования проектов. Для организации локального сервера в операционной системе Windows (WAMP, Windows-Apache-MySQL-PHP) могут быть полезны пакеты: Денвер, XAMPP, AppServ, OpenServer и т.д. После установки этих пакетов, вы получите уже настроенный и готовый к использованию сервер, а управляться он будет через удобное меню самой программы. Также, существуют и отдельные реализации APACHE, MySQL и PHP для операционной системы Windows, но настраивать их придется уже самостоятельно через конфигурационные файлы и не будет никакого меню с галочками. Для запуска, перезапуска и остановки такого сервера можно будет использовать пакетные файлы *.bat или *.cmd (батник) с командами запуска, перезапуска или остановки служб APACHE и MySQL. Третий и самый непростой для новичка вариант — это виртуальная машина с установленной и настроенной операционной системой Linux (LAMP, Linux-Apache-MySQL-PHP). Готовые образы таких «виртуалок» часто встречаются в Интернете, так что вам могут понадобиться только знания настройки программ типа VirtualBox или VMware.

Подготовка к программированию на языке PHP для чайников

  1. PHP код следует помещать в файле index.php, сам файл должен быть размещен в корневом каталоге сайта, расположенного на веб-сервере.
  1. Весь код на языке PHP должен быть заключен между дескрипторами или сокращенный вариант , но веб-сервер может быть не сконфигурирован для использования сокращенного варианта такой записи, поэтому предпочтителен первый вариант.
  2. Вставлен PHP код может быть в любое место HTML кода.
  3. Комментирование в PHP коде осуществляется следующим образом:
  1. Для того, чтобы посмотреть ваш код, откройте веб-браузер и в адресной строке введите: http://localhost/www/MyEX/index.php

Вывод данных на экран с помощью языка PHP для чайников

  1. Вывод данных в окно (клиентскую область веб-браузера) с помощью PHP можно выполнить посредством оператора echo. Этот оператор позволяет вывести данные различных типов: числа, символьные строки и т.д.
  2. Синтаксис оператора вывода:
  1. Строковые данные заключаются в двойные или одинарные кавычки. В двойных кавычках код интерпретируется PHP. Все, что заключено в одинарные кавычки выводится без какой бы ни было интерпретации. Пример:

Пример $x кода

Пример $x кода

  1. Для вывода более подробной информации о переменной, которая может понадобиться при отладке программы, служит функция var_dump(). Ее синтаксис:
  1. В списке переменных указывается одно или несколько имен переменных. Эта функция ничего не возвращает. Пример:
  1. Менее информативной, чем var_dump(), функцией вывода сведений о переменных является:
  1. Для переменных типа «массив» эта функция выводит список вида индекс => элемент.

Переменные языка РНР для чайников

  1. Переменные – контейнеры для хранения данных. Данные, сохраняемые в переменной, называют значением этой переменной.
  2. Переменная имеет имя – последовательность букв, цифр и символа подчеркивания без пробелов и знаков препинания, начинающаяся обязательно с символа доллара ($), за которым должна следовать буква или символ подчеркивания.
  3. Правильные имена переменных: $_tel, $tmp, $my_, $address_234_45.
  4. Неправильные имена переменных: $234tel, my address, $tel:234.
  5. РНР является регистро-ависимым языком относительно имен переменных и констант. Однако ключевые слова могут использоваться в любом регистре.

Типы данных языка РНР и преобразование данных для чайников

Тип данных Пример Описание значений
Строковый или символьный (string) «Привет всем»
«123456»
«25 рублей»
Последовательность символов, заключенная в кавычки
Целочисленный, числовой (integer) -234
25
Число или последовательность цифр, перед которыми может быть указан знак числа
Числовой с плавающей точкой (float) 5.47
21.4
35E-3
Число с дробной частью (35Е2 означает 3500)
Логический (булевый, boolean) true
false
Этот тип имеет два значения: true (истина, да), false (ложь, нет)
NULL null Этот тип данных имеет одно значение — null
Массив (Array) Этот тип данных имеет одно множество значений, которые могут быть различных типов
Объект (Object) Программный объект, определяемый своими свойствами
  1. Для того, чтобы узнать какой тип переменной, нужно воспользоваться функцией:
  1. Для явного задания типа можно воспользоваться одним из двух способов:

Константы языка PHP для чайников

  1. Константой называется именованная величина, которая не изменяется в процессе выполнения программы (скрипта).
  2. В отличие от переменных, вы не можете изменять значения констант, которые были им присвоены при их объявлении. Константы удобно использовать для хранения значений, которые не должны изменяться во время работы программы. Константы могут содержать только скалярные данные (логического, целого, плавающего и строкового типов).
  3. В РНР константы определяются функцией define(). Вот ее синтаксис:

$name — имя константы.
$value — значение константы.
$case_sen — необязательный параметр логического типа, указывающий, следует ли учитывать регистр букв (true) или нет (false).

  1. Для проверки существования константы можно использовать функцию defined(). Данная функция возвращает true, если константа объявлена. Пример:

Различия между константами и переменными в языке PHP для чайников

  1. У констант нет приставки в виде знака доллара ($).
  2. Константы можно определить только с помощью функции define(), а не присваиванием значения.
  3. Константы могут быть определены и доступны в любом месте без учета области видимости.
  4. Константы не могут быть определены или аннулированы после первоначального объявления.
  5. Константы могут иметь только скалярные значения.

В этой статье я перечислил базовые понятия языка PHP для чайников. Теперь пора ознакомиться с конструкциям этого языка и перейти, непосредственно, к программированию. Об этом моя следующая статья — PHP программирование для чайников.

Как нанять php программиста в 2020 не потеряв лишнего времени

Так сложилось, что я не часто менял работу и не имел большого опыта прохождения собеседований. Зато у меня был большой опыт проведения технических интервью (здесь и далее синоним собеседования). Статья не претендует на открытие чего-то нового. В феврале с некоторым шумом закрылся стартап, где я работал в качестве тимлида. Я искал работу до середины мая. За это время я прособеседовался в десятках компаний. Это был великолепный экскурс на обратную сторону диалога соискателя и работодателя. Я был удивлен до какой степени банальные вещи пропускаются hr-ами даже в крупных агентствах.

Далее рассказ как правильно с точки зрения программиста организовать собеседование.

Базовой ситуацией стоит считать, что у hr есть резюме программиста.
Работодателю необходимо составить и опубликовать (или отправить соискателю) текстовое описание вакансии. Бесполезно сразу звонить и голосом описывать вакансию.

Повторюсь, в этом нет ничего нового. Но пару раз в телефонном звонке сразу после названия фирмы меня звали на собеседование и просили сообщить доступное время.
Из наименования вакансии “старший/ведущий php-разработчик” можно догадаться только о том, что предстоит разрабатывать на php. А если по телефону пытаться рассказывать больше, то ничего из этого не запомниться. Единственное когда стоит сперва звонить — если соискатель сам об этом явно просит. Например выставив желаемый способ связи на известном сайте.

Итак что указывать в вакансии?

Невероятно, но даже кадровые агентства начинают общение без текста вакансии на руках и спрашивают, а что нужно уточнить у компании про вакансию. Опять же если посмотреть на всеми известный сайт, можно увидеть почти стандартный состав вакансии:

  • название
  • текстовое описание фирмы и ее деятельности — тут у hr не возникает обычно проблем
  • текстовое описание основного вида деятельности и задачи отдела/должности будущего работника
  • обязательный технический стек — что должен знать соискатель
  • сопутствующий технический стек — с чем еще предстоит работать соискателю
  • условия труда — если вас их постоянно спрашивают, значит можно дополнить
  • тестовое задание

Почему название важно?

Что вы первое прочли в этой статье? Так или иначе, скорее всего дойдя до этого места название вы уже видели. Но я расскажу почему название важно для разработчика.

Во первых подавляющему числу соискателей все равно написано в вакансии “php-разработчик”, “php-developer”, или даже “PHP-инженер-программист”. Не загромождайте название синонимами. Добавьте что-то важное для вас. Или что-то важное для соискателя. Самый простой способ дать более точное название вакансии, это уточнить с чем придется работать (часть обязательного стека). Например укажите базу данных или фреймворк: “php+mysql developer”, “php (symfony) developer”. Среди моих знакомых много тех, кто ориентируется на основную используемую базу данных и фреймворк.

И особенно много тех кто избегает использования всем известного отечественного “фреймворка”

Что делать-то предстоит?

Складывается ощущение, что hr надеются скрыть проблемы будущей должности и не пишут эту часть. В результате основные задачи выясняются уже на очном собеседовании. На что здесь обращает внимание программист. В основном тут ожидаются следующие фразы “code review”, “легаси код” (обычно даже так: “умение разбираться в чужом коде”), “трекер задач”, “управление командой”, “планирование сроков и ресурсов”.

Обычно эти фразы разбросаны по простому тексту, но бывает и представлены в виде списка. Так или иначе здесь стоит быть наиболее откровенным с будущим работником. Его стоит предупредить о сложностях командного взаимодействия и о текущих проблемах.

Если проблемы продукта это как раз задача разработчика, то командное взаимодействие уже не такой однозначный вопрос. Здесь стоит обозначить все те аспекты с которыми придется работать в любом случае. Например:

  • Работа с фрилансерами и/или фирмой подрядчиком — мне достаточно часто встречались такого рода вакансии. Обычно есть уже некая собранная удаленная команда, над которой ставится штатный сотрудник.
  • Ограничение службы безопасности. Может в офисе работодателя действует особый пропускной режим, а на машинах стоит только windows и все сотрудники лишены административных прав.

Используемый стек технологий

Есть старый анекдот “Если бы водителей нанимали как программистов”. Современные реалии все же несколько приятнее. В большинстве вакансий есть разделение требований на 2 списка (обязательный и дополнительный). Проблема в том что заголовок дополнительного списка “Будет плюсом знание:” мало информативен. У соискателя возникает ряд вопросов:

  • Если я что-то знаю из этого списка меня с большей вероятностью возьмут или больше зарплату дадут?
  • Это используемый стек? Или планируемый? Или наоборот это стек предыдущего решения, которое нужно переписать?
  • А не технологический ли зоопарк тут?

Обозначайте применимость дополнительного списка.

Пишите только реально используемые версии софта (включая минорную). “PHP 7.1” — гораздо более информативная запись нежели “PHP 5-7”.

Тестовое задание, тест в браузере, или просто вопросы по телефону.

Аккуратно отсеивание не квалифицированных кадры с помощью дистанционной проверки знаний — возможно самый эффективный способ экономии времени на очных собеседованиях.

На самом деле здесь многое зависит от возможностей фирмы. Все способы дают приемлемый результат при должной подготовке задания. Если статья будет интересна аудитории, в следующей расскажу как составлять тестовые задания для php программистов.

Так или иначе задание должно выполняться за достаточно короткий промежуток времени (от 15 минут до 4х часов). Если вы до очного собеседования берете на себя обязательства по проверке решения задания, вы формируете ожидание у соискателя, что он получит результат проверки. Сказать “нет, не правильно” уже будет недостаточно.

Некоторые компании стали практиковать прием тестового задание выполненногосоискателем в рамках собеседования в сторонних фирмах. Зачастую цель такого задания — первичная проверка профпригодности будущего сотрудника и повод для начала диалога на очном собеседовании. Поэтому может не иметь значения, какая именно задача решалась при выполнении задания.

Звонки и почта как способ избежать собеседования.

Еще выступая на стороне работодателя, я обратил внимание, что все больше соискателей предлагают первую встречу провести в видео чате. А в начале своих поисков работы я не сразу догадался до такого же приема. Переломным моментом стал визит на очное собеседование в известное технологическое представительство одного банка на вакансию “web-разработчик”. Где по просьбе собеседующих я рассказал немного о себе, а после услышал вопрос: “А как у вас с js?”

Как оказалось этому тех. представительству нужен был фронтенд разработчик. А все дело в том, что в вакансии не был указан предполагаемый род деятельности и не было никакого предварительного общения — сразу собеседование.

В итоге я как и многие другие разработчики стал предлагать сперва пообщаться удаленно. Кроме того я подготовил список критичных для себя вопросов, на которые можно ответить даже по почте. Этот список может дополняться вопросами, возникшими после прочтения описания вакансии:

  • На сколько пунктов по тесту Джоэла оценивает себя команда? https://habr.com/company/jugru/blog/159689/
  • Какой текущий/планируемый состав команды разработки (технические специалисты)?
  • Команда расширяется или ищется замена ушедшему сотруднику? (Что случилось с занимавшим эту должность сотрудником? / В связи с чем расширение штата?)
  • Используется ли база данных? Пишутся ли миграции? Кто и как проверяет миграции базы данных перед релизом?
  • Как настроен ci/cd? Если никак, готовы и потратить месяц на настройку?
  • Кто и как ставит задачи?
  • На какой машине придется работать?
  • Есть ли что-то еще о чем я не спросил, но мне стоит это знать?

К этим и прочим вопросам нужно быть готовым еще при первом звонке/письме.

Ожидаемо что вопросы есть и к соискателю. Стоит задавать вопросы так чтобы соискатель мог наиболее коротко и однозначно на них ответить. На самом деле первый диалог с соискателем HR должен воспринимать как способ проверить ценность будущей встречи. У вас никогда не было ситуации что собеседование перестает иметь смысл уже после 2-4 вопросов? Записывайте вопросы которые привели к досрочному окончанию встречи. Ниже приведу краткий перечень таких вопросов, накопленных личным опытом.

  • (Кратко озвучиваются основные положения вакансии) все верно?
  • Почему уходите с предыдущего места работы?
  • Как скоро вы готовы выйти к нам в случае получения предложения?
  • При выходе на работу потребуется паспорт, трудовая … (перечень необходимых документов). С этим проблем не возникнет?
  • Готовы ли вы выполнить небольшое тестовое задание на очном собеседовании?

Если HR может оценить правильность ответов на технические вопросы это замечательно и этим нужно пользоваться. Такие вопросы должны подразумевать краткие ответы. Да и сами вопросы должны легко восприниматься на слух. Опять же спрашивайте максимально близкие темы к востребованной ежедневной работе специалиста. Ниже приведу пример некоторых таких вопросов:

  • *nix/cli: Как посмотреть последние несколько строк текстового файла (лога)? А как следить за его наполнением?
  • *nix/cli: Вы написали php скрипт для запуска в консоли. Как посмотреть существует ли процесс?
  • *nix/cli: Есть папка с изображениями как узнать ее размер?
  • php: Какой вариант проверки существования данных в массиве наиболее быстрый? Почему?
  • php: Используете ли вы declare(strict_types=1)? Почему?
  • sql: Спрашивайте общие вопросы не зависящие от конкретной реализации базы данных, если речь идет о наборе не специалиста узкого профиля.
  • sql: Есть таблица с комментариями. У коментариев есть оценка (целое положительное число).Как выбрать топ 10 комментариев? Как выбрать все комментарии с максимальной оценкой?
  • sql: Какие индексы существуют?
  • sql: Какие виды блокировок существуют?
  • sql: Что такое ACID? Какие уровни изоляции существуют?

На самом деле диалог о технических навыках соискателя стоит записывать. Т.к. ответ может оказаться правильным, но сложным для HR, сверяющего ответы с подготовленным “листочком”. И не забудьте, что о записи разговора нужно предупредить.

Очное собеседование

Итак, пора назначить встречу с соискателем. Будьте последовательны. Предупредите кандидата о длительности встречи, о предполагаемом составе, о тестовых задачах. Спросите о удобном времени для собеседования. В идеале у вас уже должен быть размечен весь доступный временной интервал — все участники собеседования в офисе + свободная переговорка.

Не стоит удивляться, что сейчас кандидаты зачастую могут приехать только с 19 часов. Иногда поступают предложение провести собеседование в выходные. В таких случаях можно предположить, что соискатель работает и однозначно не уверен в том, что хочет перейти именно к этому работодателю. Видимо предыдущие письма и звонки не были достаточно убедительными. Собеседование в нерабочее время уже не новинка. Но обеим сторонам нужно быть уверенными, что оно не закончится через 4 минуты фразой “вы нам не подходите”.

Так или иначе после согласования даты и времени по телефону обязательно пришлите приглашение на встречу по почте (с указанием адреса и схемы проезда).

Кто должен присутствовать на встрече

Сейчас уже ни для кого не секрет, что очное собеседование делится на 2-3 части по составу собеседующих (hr, технический специалист, руководитель). Действительно такое разделение во времени помогает использовать ресурсы оптимально. Этот подход взят на вооружение почти везде и никого не смущает. Но есть различное понимание как эти части должны быть отделены. И зачастую предполагается несколько очных собеседований. В моем понимании, это плохая практика. Работодатель таким образом заставляет соискателя потратить время на 4-6 поездок. В случае крупных городов это легко может в сумме превысить время рабочего дня.

Ёмко, а не быстро.

Идеальная ситуация в найме технического специалиста это всего 2 письма (описание вакансии и приглашение на встречу) , один телефонный звонок (уточнение всех вопросов и назначение даты встречи), и одна встреча в офисе фирмы. Этого на самом деле достаточно. Если у вас более сложный поток обработки вакансий — переносите его на почту и звонки.

Каждый контакт двух сторон должен приводить большему пониманию будущих взаимоотношений. В идеале, до встречи с соискателем вы уже должны быть уверены, что можете взять его на работу.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Добро пожаловать

В интернете очень много устаревшей информации, которая приводит к заблуждению, распространению неверных решений и написанию плохого кода у начинающих PHP-разработчиков. Это нужно остановить. PHP: Правильный Путь — легкочитаемое руководство для быстрого ознакомления с правилами эффективного использования PHP, принятыми стандартами написания кода и ссылками на признанные руководства по всему интернету.

Переводы

Руководство PHP: Правильный путь уже (или вскоре будет) переведено на множество различных языков:

Дисклеймер

В интернете не существует описания каноничного способа использования PHP. Как бы то ни было, этот скромный сайт содержит лучшие решения, доступные варианты и другую полезную информацию. Он направлен на ознакомление начинающих разработчиков с PHP и переосмысление опытными профессионалами свежих идей.

Это живой документ и он продолжит обновляться более полезной информацией и примерами по мере их появления.

Как внести вклад

Помогите сделать этот сайт лучшим ресурсом для начинающих PHP программистов! Помочь используя GitHub

Расскажите о нас

Руководство PHP: Правильный путь содержит веб-баннеры, которые вы можете использовать на своём сайте. Окажите поддержку, показав начинающим PHP-разработчикам где они могут найти полезную информацию!

Начало

Использование стабильной версии (7.2)

Если вы только начинаете работу с PHP, убедитесь в том, что вы используете текущую стабильную версию PHP 7.2. За последние несколько лет PHP добился больших успехов, добавив новые возможности.

Наиболее часто в ближайшем будущем вы будете видеть, что используются версии PHP 5.x, с последней 5.6. Но вы должны попробовать использовать последнюю стабильную версию, если это возможно. Не дайте скромной разнице между числами 5.2 и 5.6 ввести вас в заблуждение, эта разница представляет важные изменения. Если вам нужна функция или пример её использования, вы всегда можете найти документацию на php.net.

Встроенный веб-сервер

Вы можете начать изучение PHP без необходимости в установке и конфигурировании полноценного веб-сервера (необходим PHP 5.4 или новее). Для запуска сервера вам необходимо выполнить следующую команду из терминала в корневой папке веб-проекта:

Установка на Mac

OSX поставляется с предзапакованным PHP, но, в лучшем случае, он немного отстает от стабильной версии. Lion поставляется с PHP 5.3.6 и Mountain Lion имеет 5.3.10.

Для обновления PHP в OSX вы можете установить его с помощью нескольких пакетных менеджеров, наиболее рекомендуемый из которых php-osx by Liip.

Другой вариант, скомпилировать самостоятельно, в этом случае убедитесь, что у вас установлен либо Xcode, либо его аналог от Apple “CLI для Xcode”, который можно загрузить с Apple Mac Developer Center.

В качестве полного набора «всё-в-одном», который включает PHP, веб-сервер Apache и СУБД MySQL, и всё это с хорошим управлением через GUI, попробуйте MAMP.

Установка в Windows

PHP для Windows можно получить несколькими путями. Вы можете загрузить установочные файлы и, до недавнего времени, вы могли использовать ‘.msi’ установщик. Начиная с PHP версии 5.3.0 установщик не поддерживается.

Для изучения и локальной разработки вы можете использовать встроенный в PHP 5.4+ веб-сервер, о конфигурации которого можно не беспокоиться. Если вы предпочитаете сервера «всё-в-одном», которые включают в себя полноценный веб-сервер и MySQL, тогда можете воспользоваться такими инструментами, как Web Platform Installer, Zend Server CE, XAMPP или WAMP, которые помогут быстро развернуть окружение для разработки в Windows. Но, стоит сказать, что эти инструменты будут отличаться от продакшна, так что будьте осторожны и учитывайте эти различия, если вы работаете на Windows и деплоите на Linux.

Если вам нужно запустить конечную систему на Windows, то IIS7 даст вам лучшую стабильность и производительность. Вы можете использовать phpmanager (плагин для IIS7) для легкого конфигурирования и управления PHP. IIS7 поставляется с встроенным FastCGI, вам нужно просто настроить PHP в качестве обработчика. Для получения помощи и дополнительной информации посетите iis.net.

Vagrant

Запуск вашего приложения в разных окружениях на этапе разработки и продакшна может привести к различным багам, которые дадут о себе знать уже непосредственно при работе приложения. Также сложно поддерживать в разных окружениях стабильные версии для всех библиотек, которые используются при работе в команде разработчиков.

Если вы разрабатываете на Windows и деплоите на Linux (или что-либо отличающееся от Windows) или разрабатываете в команде, вы должны рассмотреть возможность использования виртуальной машины. Это звучит сложно, но, используя Vagrant, вы можете установить простую виртуальную машину всего лишь в несколько шагов. Они могут быть как выполнены вручную, так и с помощью специализированного софта, например, Puppet или Chef, который автоматизирует эту задачу. Использование этого софта гарантирует использование одинаковой конфигурации для нескольких машин, что избавляет вас от необходимости поддержки сложных списков установки. Вы также можете удалить вашу машину, и пересоздать её без большого количества ручных шагов, что делает создание «свежей» виртуалки очень простым.

Vagrant создает общие папки, которые используются для совместного использования кода между вашим хостом и виртуальной машиной, а это означает, что вы можете создавать и редактировать файлы на хосте и позже запускать код в вашей виртуальной машине.

Стандарты написания кода


Сообщество PHP является очень большим и разнообразным, сочетая в себе бесчисленное количество библиотек, фреймворков, и различных компонентов. Для PHP разработчика это обычная практика — выбрать несколько из них и соединить в одном проекте. Очень важно придерживаться общих стандартов написания кода (так точно, насколько это возможно) в своём PHP коде, чтобы позволить разработчикам сочетать и использовать различные библиотеки для своих проектов.

Группа Совместимости Фреймворков предложила и одобрила ряд стилевых рекомендаций, известных как PSR-0, PSR-1 и PSR-2. Не дайте веселым именам смутить вас, эти рекомендации представляют собой набор правил, которых начинают придерживаться такие проекты, как Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium и другие. Вы можете использовать их при работе над собственным проектом, или в дальнейшем использовать ваш собственный стиль.

В идеале, вы должны писать PHP код, придерживаясь известных стандартов. Это может быть любая комбинация PSR-ов, или один из стандартов кода, сделанных PEAR или Zend. Это позволит другим разработчикам легко читать и работать с вашим кодом, и приложения, которые используют компоненты, смогут сохранить структуру приложения, даже работая с огромным количеством стороннего кода.

Вы можете использовать PHP_CodeSniffer чтобы проверить код на соответствие одной из этих рекомендаций, а также плагин для текстовых редакторов, таких как, к примеру, Sublime Text 2 чтобы получить отчёт в реальном времени.

Используйте PHP Coding Standards Fixer, созданный Фабиеном Потенсьером, для автоматического исправления синтаксиса вашего кода так, чтобы он соответствовал этим стандартам, что спасет вас от исправления каждой проблемы вручную.

Английский язык является наиболее предпочтительным для всех символических имен и инфраструктуры кода. Комментарии могут быть написаны на любом языке, который будет легко читаем текущими и будущими разработчиками, которым предстоит работать над кодом.

Основные моменты языка

Парадигмы программирования

PHP представляет собой гибкий, динамичный язык, который поддерживает несколько техник программирования. Он значительно развился в течение последних нескольких лет: добавлена мощная объектно-ориентированная модель в PHP 5.0 (2004), анонимные функции (замыкания) и пространства имен в PHP 5.3 (2009), а также трейты в PHP 5.4 (2012).

Объектно-ориентированное программирование

PHP реализует очень большой набор особенностей объектно-ориентированного программирования, включая поддержку классов, абстрактных классов, интерфейсов, наследования, конструкторов, клонирования, исключений и т.д.

Функциональное программирование

PHP поддерживает первоклассные функции, т.е. функция может быть применена к переменной. И определенные пользователем, и встроенные функции могут быть применены к переменной и вызываться динамически. Функции могут быть переданы, как аргумент к другой функции (эта особенность называется функцией высшего порядка), а также функция может возвращать другую функцию.

Рекурсия — это особенность, которая позволяет функции вызывать саму себя, это поддерживается языком, но бо́льшая часть кода PHP фокусируется на итерации.

Анонимные функции (замыкания) поддерживаются PHP начиная с версии 5.3 (2009).

В PHP 5.4 добавлена возможность связывать замыкание с областью видимости объекта, а также улучшена поддержка callables (всё, что может быть вызвано), так что они могут быть использованы наравне с анонимными функциями практически во всех случаях.

Meta Programming

PHP поддерживает несколько форм метапрограммирования, что реализуется с помощью таких механизмов, как Reflection API и Магические Методы. Доступно много Магических Методов, например: __get() , __set() , __clone() , __toString() , __invoke() , и т.д., которые позволяют отслеживать поведение внутри класса. Разработчики Ruby часто говорят, что PHP не хватает method_missing , но он доступен, как __call() и __callStatic() .

Пространства имен

Как было сказано выше, сообщество PHP состоит из множества разработчиков, создающих очень много кода. Это значит, что одна библиотека PHP может иметь такое же название класса, как и другая. Когда обе библиотеки используются в одном пространстве имен, они конфликтуют и возникают проблемы.

Пространства имен решают эту проблему. Как описано в руководстве PHP, пространства имен можно сравнить с папками операционной системы, которые являются пространствами имен файлов; два файла с одинаковым именем могут сосуществовать в разных директориях. Подобно этому, два PHP класса с одинаковым названием могут существовать в разных пространствах имен PHP.

Использование пространств имен необходимо для того, чтобы избежать конфликтов при использовании вашего кода с библиотеками других разработчиков.

Один из рекомендуемых способов использования пространств имен описан в PSR-4, который призван обеспечить стандарты для описания файлов, классов и пространств имен, что позволяет создавать подключаемый (plug-and-play) код.

Стандартная Библиотека PHP (SPL)

Стандартная библиотека PHP (SPL) поставляется вместе с PHP и предоставляет набор классов и интерфейсов. Она состоит в основном из часто используемых классов структур данных (стек, очередь, куча, и т.д.), а также итераторов, которые предназначены для прохождения через эти структуры данных или ваши собственные классы, которые реализуют интерфейсы SPL.

Интерфейс командной строки

Главная цель, с которой был создан PHP — это разработка веб-приложений, но он также полезен при написания кода для интерфейса командной строки (CLI). PHP программы командной строки могут помочь вам автоматизировать такие общие задачи, как тестирование, развертывание и администрирование приложения.

CLI PHP программы очень мощные, потому что вы можете использовать код вашего приложения напрямую, без нужды в создании и обеспечении безопасности веб-интерфейса (GUI) для него. Только убедитесь, что вы не используете для ваших скриптов (CLI) корень вашего веб-сервера.

Попробуйте запустить PHP из консоли:

Опция -i выдаст вам конфигурацию вашего PHP, подобно функции phpinfo .

Опция -a предоставляет доступ к интерактивной оболочке, подобно ruby IRB или интерактивной оболочки python. Также существует целый ряд других полезных опций командной строки.

Давайте напишем простую «Привет, $name» программу CLI. Чтобы это сделать, создайте файл с именем hello.php , как показано ниже.

PHP устанавливает две специальные переменные, основанных на аргументах, с которыми запущен ваш скрипт. $argc — это переменная с числовым значением, которая содержит количество переданных аргументов, $argv — это массив, содержащий значение каждого аргумента. Первый аргумент — всегда название вашего PHP скрипта, в этом случае hello.php .

Выражение exit() используется с ненулевым числом, чтобы дать оболочке понять, что команда не удалась. Часто используемые коды завершения можно найти здесь

Для запуска сценария, указанного выше, наберите в командной строке:

XDebug

Один из самых полезных инструментов в разработке программного обеспечения — хороший отладчик. Он позволяет вам отследить исполнение вашего кода и контролировать содержимое вашего стека. XDebug — это PHP отладчик, который может использоваться различными IDE, чтобы дать вам возможность устанавливать Брейкпоинты (точки отладки кода) и контролировать стек. Он также позволяет использовать такие инструменты, как PHPUnit и KCacheGrind, для покрытия кода тестами и его профилирования.

Если вы оказываетесь в безвыходном положении при использовании var_dump/print_r, и у вас не получается найти решение, то возможно вам поможет использование отладчика.

Установка XDebug может оказаться сложной, но одна из самых полезных его функций это «Удаленная отладка» — если вы разрабатываете код локально и затем тестируете его в локальной машине или на другом сервере, Удаленная Отладка — это возможность, которую вы захотите сразу же включить.

Стандартно, вы отредактируете ваш Apache VHost или .htaccess файл со следующими значениями:

“remote_host” и “remote_port” будут указывать на ваш локальный компьютер и порт, который вы указали в вашей IDE для прослушивания. Дальше достаточно включить режим «ожидания соединений» в вашей IDE, и загрузить URL:

Ваша IDE теперь будет перехватывать текущее состояние, позволяя вам устанавливать брейкпоинты и исследовать значения в памяти по мере выполнения скрипта.

Менеджер зависимостей

Существует много библиотек, фреймворков и компонентов PHP на выбор. Ваш проект, скорее всего, будет использовать некоторые из них — это и есть зависимости проекта. До недавнего времени в PHP не существовало удобного способа для управления зависимостями проекта. Даже если вы управляете ими вручную, вам приходилось беспокоиться об автозагрузчиках. Больше это не требуется.

В настоящее время существует две основные системы управления пакетами для PHP — Composer и PEAR. Какая из них подходит именно вам? Ответ — обе.

  • Используйте Composer для управления зависимостями одного проекта.
  • Используйте PEAR для управления зависимостями всех проектов во всей вашей системе.

В общем, пакеты Composer будут доступны только в проектах, для которых вы явно укажете его использование, тогда как пакеты PEAR будут доступны во всех ваших PHP проектах. PEAR, на первый взгляд, может показаться более простым подходом, но есть преимущества в использовании подхода «проект-к-проекту» для зависимостей.

Composer и Packagist

Composer является блестящим менеджером зависимостей для PHP. Укажите список зависимостей вашего проекта в файле composer.json и, с помощью нескольких простых команд, Composer автоматически скачает зависимости вашего проекта и установит для вас автозагрузку.

На данный момент существует много PHP библиотек, которые совместимы с Composer, готовых для использования в вашем проекте. Список этих «пакетов» есть на Packagist, официальном репозитории для Composer-совместимых PHP библиотек.

Как установить Composer

Вы можете установить Composer локально (в вашей текущей рабочей директории; хотя это не рекомендуется) или глобально (например /usr/local/bin). Предположим, вы хотите установить Composer локально. Из корневой директории вашего проекта выполните:

Это позволит загрузить файл composer.phar (бинарный PHP-архив). Вы можете запустить его, используя php для управления зависимостями вашего проекта. Обратите внимание: Если вы скачаете код напрямую в ваш интерпретатор, пожалуйста, сперва прочитайте код онлайн, для подтверждения его безопасности.

Как установить Composer (вручную)

Ручная установка Composer — это продвинутая техника; однако, существуют причины, по которым разработчик может предпочесть именно этот метод использованию интерактивной установки. Интерактивная установка проверяет настройки PHP, чтобы подтвердить, что:

  • Используется необходимая версия PHP
  • Файлы .phar могут быть верно выполнены
  • Определенные права на каталог достаточны
  • Не установлены конфликтные расширения
  • Установлены необходимые настройки php.ini

В случае, если ни одно из этих условий не соблюдено, вы должны принять решение стоит ли идти на такой компромисс. Ниже описано, как установить Composer вручную:

Путь $HOME/local/bin (или другой каталог, выбранный вами) должен находиться в вашей переменной окружения $PATH . Это позволит быть доступной команде composer .

Если вы прочтете документацию Composer, которая гласит, что нужно запускать Composer с помощью команды php composer.phar install , вы можете заменить эту команду на:

Как объявить и установить зависимости

Composer продолжает следить за зависимостями вашего проекта в файле composer.json . Вы можете управлять им вручную, если вам нравится, или же использовать сам Composer. Команда php composer.phar require добавляет зависимость в проект и, если в каталоге нет файла composer.json , он будет создан. Далее мы рассмотрим пример, который добавляет Twig, как зависимость вашего проекта. Запустите это в корневой директории вашего проекта, куда вы загружали composer.phar :

Аналогично команда php composer.phar init проведет вас через создание полного файла composer.json для вашего проекта. Есть и другой путь, когда вы создадите файл composer.json вы можете сказать Composer, чтобы он скачал все ваши зависимости в папку vendors/ . Это также применимо для проектов, которые вы загрузили и которые предоставляют файл composer.json :

Затем добавьте этот код в основной PHP-файл вашего приложения; это укажет PHP использовать автозагрузчик Composer для зависимостей вашего проекта.

Теперь вы можете использовать зависимости вашего проекта и они будут автоматически загружаться (по требованию).

Обновление зависимостей

Composer создает файл composer.lock который хранит точную версию каждого пакета, который он загрузил во время первого запуска php composer.phar install . Если вы поделились проектом с другими разработчиками и файл composer.lock является частью него, то при запуске php composer.phar install они получат ту же версию, что и вы. Чтобы обновить ваши зависимости запустите php composer.phar update .

Очень удобно гибко указывать требуемые версии. Если вы нуждаетесь в версии

1.8, что значит “всё что новее 1.8.0, но меньше 2.0.x-dev”. Вы также можете использовать шаблон * , например 1.8.* . Теперь команда Composer php composer.phar update обновит все ваши зависимости до новейших версий, которые соответствуют указанным ограничениям.

Проверка ваших зависимостей на безопасность

Security Advisories Checker является веб-сервисом и инструментом командной строки, оба из которых изучают ваш файл composer.lock и сообщают, если есть необходимость в обновлении какой-либо из ваших зависимостей.

Другим ветераном среди пакетных менеджеров, которым наслаждаются многие PHP-разработчики, является PEAR. Он работает практически так же, как и Composer, но имеет несколько важных отличий.

PEAR требует, чтобы каждый пакет имел определенную структуру, это означает, что автор пакета должен подготовить его для использования с PEAR. Использование проекта, который не был подготовлен для работы с PEAR невозможно.

PEAR устанавливает пакеты глобально, что означает то, что после установки, они доступны всем проектам на этом сервере. Это может быть полезно, если много проектов строятся на тех же пакетах с той же версией, но может привести к проблемам, если проекты разрабатывались для разных версий.

Как установить PEAR

Вы можете установить PEAR, загрузив установщик phar и выполнив его. Документация PEAR содержит подробную инструкцию по установке для каждой операционной системы.

Если вы используете Linux, вы также можете посмотреть наличие PEAR в пакетном менеджере вашего дистрибутива. Debian и Ubuntu, к примеру, содержат информацию о пакете php-pear в пакетном менеджере apt.

Как установить пакет

Если пакет существует в списке пакетов PEAR, вы можете установить его, указав официальное название:

Если пакет выложен на другом канале, вам нужно сначало сделать discover этого канала и затем указать его во время установки. Подробнее об этом в использование каналов.

Обработка зависимостей PEAR с Composer

Если вы уже используете Composer и желаете установить какой-то код из PEAR, вы можете использовать Composer для обработки зависимостей PEAR. Этот пример установит код из pear2.php.net :

Первый раздел «repositories» даст понять Composer, что он должен сделать “initialise” (или “discover” в терминологии PEAR) репозиторий pear. Затем секция require укажет именам пакетов префикс, как ниже:

Префикс “pear” жестко ограничен, чтобы избежать любых конфликтов, так как каналы Pear могут быть схожи с другими поставщиками пакетов например, вместо короткого имени (или полного URL) может быть использовано для объявления в каком канале находится пакет.

Когда код будет установлен он будет доступен в вашей папке vendor и автоматически доступен через автозагрузчик (файл Autoload) Composer.

Чтобы использовать этот пакет PEAR просто объявите как ниже:

Практики написания кода

Основы

PHP — это обширный язык, который позволяет разработчикам всех уровней писать код не только быстро, но и эффективно. В любом случае, изучая язык, мы нередко забываем основы, которые мы изучали изначально (или бегло просмотрели), в пользу коротких путей и/или вредных привычек. Чтобы помочь в борьбе с этой общей проблемой, эта секция предназначена для напоминания разработчикам основ практик написания кода PHP.

Дата и время

PHP содержит встроенный класс DateTime, предназначенный для чтения, записи, сравнения и вычисления даты или времени. Также в PHP много функций, связанных с датой и временем, помимо класса DateTime, но класс предоставляет хороший объектно-ориентированный интерфейс для решения большинства задач. Он способен даже обрабатывать временные зоны, но это уже не рассматривается в данном коротком введении.

Для начала работы с DateTime, сконвертируйте «сырую» строку даты и времени в объект с помощью фабричного метода createFromFormat() или выполните new \DateTime , чтобы получить текущую дату и время. Используйте метод format() для конвертирования DateTime обратно в строку для вывода.

Вычисления с DateTime возможны с использованием класса DateInterval. У класса DateTime есть методы add() и sub() , которые принимают DateInterval, как аргумент. Не пишите код, который ожидает одинаковое число секунд каждый день, перевод часов и смена часовых поясов разрушат это предположение. Вместо этого используйте интервалы дат. Для расчета разницы между датами используйте метод diff() . Он вернет новый объект DateInterval, который очень легко отобразить.

С объектами DateTime, вы можете использовать стандартные методы сравнения:

И последний пример для демонстрации класса DatePeriod. Он используется для перебора повторяющихся событий. Класс может принимать два объекта DateTime, начало и конец, и интервал, для которого он вернет все события между ними.

Design Patterns

При построении приложения полезно использовать в коде шаблоны, а также придерживаться некоторых стандартов для всей структуры проекта. Использование шаблонов полезно, потому что оно упрощает управление кодом, а также позволяет другим разработчикам быстро понять, как всё взаимодействует друг с другом.

Если вы используете фреймворк, то большинство высокоуровневого кода и структура проекта будет основываться на архитектуре фреймворка, поэтому большинство решений относительно шаблона сделано за вас. Но всё же наиболее верным решением будет выбрать наиболее подходящие шаблоны и следовать им в коде, который вы пишете на базе фреймворка. С другой стороны, если вы не используете фреймворк для построения приложения, тогда вы должны найти шаблоны, которые наилучшим образом соответствуют типу и размеру приложения, которое вы создаете.

Исключения

Исключения — это неотъемлемая часть большинства популярных языков программирования, но зачастую PHP разработчики не уделяют им должного внимания. Языки, подобные Ruby, очень подробно обрабатывают исключения, поэтому, если что-то идёт не верно, например: не удался HTTP запрос, запрос к базе данных происходит неправильно или если запрошенное изображение не было найдено, Ruby (или используемые гемы) выбросит исключение на экран, помогающее понять где вы допустили ошибку.

PHP сам по себе довольно слаб в плане этого и вызов file_get_contents() , как правило, даст вам только FALSE и предупреждение. Многие устаревшие PHP-фреймворки, как CodeIgniter, просто вернут false, добавят сообщение в свой собственный журнал и, может быть, дадут вам использовать метод, как $this->upload->get_error() , чтобы посмотреть, что пошло не так. Проблема в том, что вы должны искать ошибку и проверять документацию, чтобы понять, какой ошибочный метод существует в этом классе, вместо того, чтобы сделать это всё более очевидным.

Еще одна проблема в том, что классы автоматически выдают ошибку на экран и закрывают процесс. Когда вы делаете это, вы не даете другому разработчику динамически обработать эту ошибку. Исключения должны быть выброшены, чтобы дать разработчику знать об ошибке и выбрать, как её обработать. Например:

Исключения SPL

Универсальный класс Exception предоставляет очень мало отладочного контекста для разработчика; как бы то ни было, для того чтобы исправить это, можно создать специализированный класс, который будет расширять возможности универсального класса Exception :

Это означает, что вы можете добавить несколько блоков отлова и обрабатывать разные исключения по-разному. Это может привести к созданию множества изменённых Исключений, некоторые из которых можно было бы избежать, используя Исключения SPL, предоставляемые расширением SPL.

Например, если вы используете магический метод __call() и вами был вызван неизвестный метод, то вместо выбрасывания стандартного исключения, которое очень расплывчато, или вместо создания своего исключения, вы можете просто использовать throw new BadFunctionCallException; .

Базы данных

Скорее всего, ваш PHP код будет использовать базу данных для сохранения информации. Существует несколько вариантов для подключения и взаимодействия с базой данных. Рекомендуемым вариантом до PHP 5.1.0 было использование нативных (родных) драйверов, таких как mysql, mysqli, pgsql, etc.

Встроенные драйвера замечательны, если вы используете ОДНУ базу данных в ваших приложениях, но если, например, вы используете MySQL и немного MSSQL, или вам нужно подключиться в базе данных Oracle, тогда вы не сможете использовать те же драйвера. Вам нужно будет изучить новый API для каждой базы данных — и это может оказаться нерациональным.

Обратите внимание, что расширение mysql для PHP больше не поддерживается, и его официальным статусом, начиная с PHP версии 5.4.0, является «Устарело в связи с длительным сроком использования». Это значит, что оно будет удалено в течение нескольких следующих релизов, так что в PHP 5.6 (или в версиях, следующих за 5.5) оно вполне может пропасть. Если вы используете mysql_connect() и mysql_query() в своих приложениях, тогда вам придется столкнуться с переписыванием кода, поэтому лучшим вариантом сейчас является использование в приложениях mysqli или PDO вместо mysql, прежде чем вы в дальнейшем столкнётесь с нерабочими приложениями. Если вы начинаете изучение баз данных с нуля, тогда полностью откажитесь от использования расширения mysql — используйте Расширение MySQLi или PDO.

PDO — это абстрактная библиотека для подключения к базе данных, встроенная в PHP с версии 5.1.0, которая обеспечивает единый интерфейс для взаимодействия с большим количеством различных баз данных. PDO не будет переводить ваши SQL запросы или эмулировать отсутствующие возможности; он чист для подключения к нескольким типам баз данных с тем же API.

Более важно, что PDO позволяет вам безопасно вводить пользовательские данные (например идентификатор) в ваши SQL запросы, без беспокойства о SQL-инъекциях. Это возможно благодаря использованию PDO выражений и связывания (bound) параметров.

Предположим, что PHP скрипт получает числовой идентификатор в качестве параметра из запроса. Этот идентификатор должен быть использован для получения пользовательских записей из базы данных. Ниже приведён неправильный способ реализации этого:

Это ужасный код. Вы вставляете необработанные параметры в SQL запрос. Это приведёт к взлому. Просто представьте, что взломщик сделает запрос http://domain.com/? >, который присвоит переменной $_GET[‘id’] значение 1;DELETE FROM users и приведёт к удалению всех ваших пользователей! Вместо этого, вы должны очистить ввод идентификатора с помощью связывания параметров PDO.

Это правильный код. Он использует связанный параметр в выражении PDO. Это позволяет избежать ввода некоректного ID перед тем, как передать запрос в базу данных, тем самым предотвращая потенциальные SQL-инъекции.

Вы также должны понимать, если подключение не закрыто должным образом, то оно использует много ресурсов, которые тратятся впустую, впрочем это больше относится к другим языкам. Используя PDO, вы можете неявно закрывать подключение уничтожив объект — все ссылки на него будут удалены, т.е. установлены в NULL. Если не сделать этого явно, PHP закроет подключение за вас, когда выполнение скрипта завершится, если только вы не используете постоянные подключения.

Уровни абстракции

Многие фреймворки предоставляют собственный уровень абстракции, который может строиться на основе PDO. Такая фактическая абстракция баз данных позволяет оборачивать запросы на PHP в методы, которые отсутствуют в одной системе баз данных, но работают в другой. Это, конечно, добавит небольшие накладные расходы, но если вы строите портативные приложения, которым необходима работа с MySQL, PostgreSQL и SQLite, тогда, для чистоты кода, минимальными накладными расходами можно пренебречь.

Некоторые уровни абстракции построены с использованием PSR-0 стандарта, поэтому могут быть установлены в любое приложение:

Безопасность

Безопасность веб-приложений

Есть плохие люди, которые могут и хотят взломать ваши веб-приложения. Важно принять необходимые меры предосторожности, чтобы укрепить безопасность вашего приложения. К счастью, прекрасные люди в The Open Web Application Security Project (OWASP) составили полный список известных проблем безопасности и методов защиты от них. Это должно быть прочитано любым разработчиком, заботящимся о безопасности.

Хэширование паролей

Наверное, каждый PHP-разработчик занимается разработкой приложений, которые нуждаются в пользовательской авторизации. Имя пользователя и пароль хранятся в базе данных и позже используются для авторизации пользователя.

Очень важно правильно хэшировать пароль перед его сохранением. Хэширование пароля является необратитым, односторонняя функция применяется на пользовательских паролях. Она возвращает строку определенной длины, которую невозможно расшифровать. Это значит, что вы можете сравнить один хэш с другим, чтобы понять, что они пришли из одной и той же исходной строки, но вы не можете определить оригинальную строку. Если ваши пароли не захэшированы, и доступ к базе данных получен третьй стороной, то ваши пользовательские аккаунты теперь скомпрометированы. Некоторые пользователи (к сожалению) могут использовать один и тот же пароль для разных сервисов. Как бы то ни было, очень важно серьезно относиться к безопасности.

Хэширование паролей с функцией password_hash

В PHP 5.5 была представлена функция password_hash . Сейчас она использует BCrypt, сильнейший алгоритм, поддерживаемый PHP. Она будет обновлена в будущем, для поддержки бОльшего числа алгоритмов, по мере необходимости. Библиотека password_compat была создана для обратной совместимости с PHP >= 5.3.7.

Ниже мы хэшируем строку и далее сверяем её с новой строкой. Поскольку наши две исходные строки отличаются (‘secret-password’ и ‘bad-password’) эта авторизация будет неудачной.

Фильтрация данных

Никогда не доверяйте пользовательскому вводу, который передаётся вашему PHP коду. Всегда проверяйте и очищайте пользовательский ввод перед его использованием в коде. Функции filter_var и filter_input помогут очистить переменные, а также проверить соответствие введённых данных некоторому формату (например, адрес электронной почты).

Пользовательский ввод может быть различным: $_GET и $_POST , данные введённые в форму, некоторые значения в суперглобальной переменной $_SERVER и тело HTTP запроса, открытое с помощью fopen(‘php://input’, ‘r’) . Запомните, что пользовательский ввод не ограничивается данными формы, отправленной пользователем. Отправляемые и загружаемые файлы, значения сессий, данные cookie и данные сторонних веб-сервисов также приравниваются к пользовательскому вводу.

Хотя пользовательские данные могут быть без проблем сохранены, скомбинированы и к ним может быть получен доступ позже, они всё ёще являются пользовательским вводом. Каждый раз, когда вы что-либо обрабатываете, объединяете или подключаете данные в ваш код, спросите себя, отфильтрованы ли эти данные и можно ли им доверять.

Данные могут быть отфильтрованы по-разному, в зависимости от их назначения. Например, когда нефильтрованные данные, введённые пользоватем, передаются в HTML код страницы, он может выполнить HTML и JavaScript на вашем сайте! Этот тип атаки известен, как Cross-Site-Scripting (XSS) и может иметь очень серьёзные последствия. Один из способов избежать XSS заключается в очистке ввода от всех HTML тэгов (их удалением, или заменой на HTML символы) с помощью функции strip_tags или экранирование символов в равносильные им HTML сущности с функцией htmlentities или htmlspecialchars .

Другой пример, передача данных для выполнения командной строкой. Это может быть крайне опасно (и, как правило — это плохая идея), но вы можете использовать встроенную функцию escapeshellarg для очистки аргументов командной строки.

Последний пример, принимает пользовательский ввод, чтобы определить, какой файл загружать из файловой системы. Это может быть использовано для изменения имени файла на путь файла. Вам нужно убрать “/”, “../”, нулевые байты или другие символы из пути файла, так чтобы скрипт не мог загружать скрытые, непубличные или конфиденциальные файлы.

Санитизация

Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода.

Например, вам необходимо нормализовать пользовательский ввод перед подключением ввода в HTML или его вставкой в сырой SQL запрос. Когда вы используете связанные параметры с PDO, они будут очищать ввод за вас.

Иногда требуется разрешить некоторые безопасные HTML тэги в вводе, когда он подключается в HTML страницу. Это очень трудно сделать и многие избегают этого, используя ограниченное форматирование, как например Markdown или BBCode, либо библиотеки с белым списком, как HTML Purifier, существующие по этой причине.

Валидация

Валидация гарантирует, что пользовательский ввод, является тем, что вы ожидаете. Например, вы можете валидировать адрес электронной почты, номер телефона или возраст при обработке запроса регистрации.

Конфигурационные файлы

Когда вы создаёте файлы конфигурации для ваших приложений, рекомендуется использование одного из следующих способов:

  • Рекомендуется хранить вашу конфигурационную информацию там, где к ней не может быть получен доступ напрямую, а доступ к ней осуществлялся через файловую систему.
  • Если вы вынуждены хранить конфигурационные файлы в корневом каталоге, именуйте файл с расширением .php . Это гарантирует, что, если к скрипту обратятся напрямую, он не будет выведен, как обычный текст.
  • Информация в файлах конфигурации, должна быть защищена соответственно, либо с помощью шифрования или системных прав группы/пользователя файла.

Использование глобальных переменных

Примечание: С появлением PHP 5.4 директива register_globals была удалена и больше не может быть использована. Это касается тех, кому нужно обновить старое приложение.

Включенный параметр конфигурации register_globals делает несколько типов переменных (в том числе из $_POST , $_GET и $_REQUEST ) глобальными, доступными в глобальной области видимости вашего приложение. Это может легко привести к проблемам с безопасностью, поскольку ваше приложение не сможет эффективно определить откуда пришли данные.

Например : $_GET[‘foo’] будет доступна через $foo , которая может заместить переменную, которая не была объявлена. Если вы используете PHP register_globals off (выключена).

Сообщения об ошибках

Логирование ошибок полезно при поиске проблемных мест вашего приложения, также логирование может выдать информацию о структуре вашего приложения. Для эффективной защиты вашего приложения от проблем, которые могут быть вызваны выводом этих сообщений, вам необходимы различные настройки сервера для разработки и продакшна.

Разработка

Для того, чтобы видеть все возможные ошибки во время разработки, настройте следующие параметры в вашем php.ini :

Установка значения в -1 покажет каждую возможную ошибку, даже если новые уровни и константы будут добавлены в новых версиях PHP. Константа E_ALL ведёт себя так-же в PHP 5.4. — php.net

Константа уровня ошибок E_STRICT была введена в 5.3.0 и не является частью E_ALL , как бы то ни было, она стала частью E_ALL в 5.4.0 Что это значит? Для вывода всех возможных ошибок в версии 5.3 вам нужно использовать либо -1 либо E_ALL | E_STRICT .

Вывод всех ошибок разными версиями PHP

  • -1 or E_ALL
  • 5.3 -1 or E_ALL | E_STRICT
  • > 5.3 -1 or E_ALL

Продакшн

Чтобы спрятать все ошибки вашей среды во время продакшна, настройте ваш php.ini следующим образом:

С этими настройками в продакшне, ошибки всё также будут записываться в лог ошибок веб сервера, но не будут показаны пользователю. Для подробной информации об этих настройках, смотрите руководство PHP:

Тестирование

Написание автоматизированных тестов для вашего кода PHP, считается наилучшей практикой. Автоматизированные тесты являются отличным инструментом для подтверждения того, что ваше приложение не сломается, когда вы внесёте изменения или добавите новую функциональность.

Существует несколько различных типов инструментов тестирования (или фреймворков) доступных для PHP, которые используют различные подходы — все, пытаются избежать ручного тестирования и нуждаются в больших командах проверки качества, чтобы убедиться, что изменения не сломают существующую функциональность.

Тесто-ориентированная разработка

Разработка через тестирование (TDD) представляет собой процесс разработки программного обеспечения, который опирается на повторении очень короткого цикла разработки: сперва, разработчик пишет автоматизированные тесты, которые определяют желаемое улучшение или новую функцию, далее производит код, который успешно пройдет этот тест и наконец производит рефактор кода для соответствия стандартам. Kent Beck, человек которому приписывают статус разработчика или “переоткрывателя” техники, TDD предлагает простую конструкцию, а также вселяет уверенность.

Существует несколько различных типов тестирования, которые вы можете сделать для вашего приложения.

Модульное тестирование (Unit Testing)

Модульное тестирование — это подход к программированию, который позволяет удостовериться, что функции, классы и методы работают, как ожидается с момента начала и до конца разработки. Проверяя значения, которые приходят и выходят из различных функций и методов, вы можете быть уверены, что внутренняя логика работает правильно. Используя Внедрение Зависимостей и внедрение классов «макетов» и заглушек, вы можете убедиться, что зависимости используются правильно для большего покрытия тестами.

При создании класса или функции, вы должны создать модульный тест для каждого возможного поведения. На базовом уровне, вы должны убедиться, что ваш код выдаёт ошибку, если вы отсылаете неправильные аргументы и работает, если вы отсылаете правильные аргументы, соответственно. Это поможет убедиться в том, что изменения, которые вы сделаете относительно этого класса или функции позднее не помешают старым работать как ожидалось. Единственная альтернатива этому var_dump() в test.php, который не является способом создания приложений — больших или маленьких.

Ещё одно использование модульных тестов — вклад в open source. Если вы можете писать тесты, которые показывают сломанную функциональность, тогда почините её, и покажите, что тест пройден, патчи имеют больше шансов быть принятыми. Если вы запускаете проект, который допускает Pull Request, тогда вы должны указать это в качестве требования.

PHPUnit является фреймворком тестирования стандарта де-факто для написания модульных тестов в PHP приложениях, но также существует несколько альтернатив.

Интеграционное тестирование

Интеграционное тестирование (иногда называется Интеграция и Тестирование, с аббревиатурой “I&T”) это фаза в тестирование програмнного обеспечения, в котором отдельные модули, комбинируются и тестируются, как группа. Это происходит после модульного тестирования и перед валидационным тестированием. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.

Многие инструменты, которые могуть быть использованы для модульного тестирования, также могут быть использованы для интеграционного тестирования, поскольку используются схожие принципы.

Функциональное тестирование

Также известное, как подтверждающее тестирование, функциональное тестирование состоит из использования инструментов для создания автоматизированных тестов, которые по-настоящему используют ваше приложение, а не просто проверяют, что отдельные куски (модули) кода ведут себя и могут взаимодействовать правильно. Эти инструменты обычно работают, используя реальные данные и симулируя реальных пользователей приложения.

Инструменты функционального тестирование

  • Selenium
  • Mink
  • Codeception это фреймворк для тестирования (всё-в-одном), включающий инструменты подтверждающего тестирования

Поведенческо-ориентированная разработка

Существует две разновидности Поведенческо-ориентированной разработки (BDD): SpecBDD и StoryBDD. SpecBDD концентрируется на техническом поведении или коде, в то время как StoryBDD концентрируется на деле, будущем поведении или взаимодействии. PHP имеет фреймворки для обоих типов BDD.

Используя StoryBDD, вы пишите читаемые людьми истории, которые объясняют поведение вашего приложения. Эти истории могут быть запущены, как актуальные тесты для вашего приложения. Фреймворк, используемый в PHP приложениях для StoryBDD — Behat, который вдохновлён проектом для Ruby Cucumber и реализует Gherkin DSL для объяснения особенностей поведения.

Вместе со SpecBDD, вы пишите спецификацию, которая объясняет, как ваш код должен себя вести. Вместо тестирования функции или метода, вы объясняете, как эта функция или метод должен себя вести. PHP предлагает фреймворк PHPSpec для данных целей. Этот фреймворк вдохновлён проектом RSpec для Ruby.

Инструменты

  • Behat, StoryBDD фреймворк для PHP, вдохновлённый проектом для Ruby Cucumber;
  • PHPSpec, SpecBDD фреймворк для PHP, вдохновлённый проектом для Ruby RSpec;
  • Codeception это фреймворк для тестирования (всё-в-одном), использующий принципы BDD;

Дополнительные инструменты тестирования

Помимо индивидуального тестирования и поведенческо-ориентированных фрэймворков, существует ряд общих фреймворков и вспомогательных библиотек, полезных для любого предпочтительного подхода.

Инструменты

  • Selenium автоматизационный инструмент для браузера интегрируемый с PHPUnit
  • Mockery Mock Object Framework интегрируемый с PHPUnit или PHPSpec

Сервера и развертывание

PHP приложения могут быть развернуты и запущены на продакшн веб-сервере рядом способов.

Платформа, как сервис (PaaS)

PaaS предоставляет системную и сетевую архитектуры, необходимые для запуска PHP приложений в веб. Это означает, как минимум, отсутствие настройки для запуска PHP приложений или PHP фреймворков.

В недавнее время PaaS стал очень популярным методом для развертывания, хостирования и расширения PHP приложений всех размеров. Вы можете найти список провайдеров PHP PaaS в нашей ресурсной секции.

Виртуальный или выделенный сервер


Если вы знакомы с администрированием системы, или заинтересованы в его изучении, виртуальный или выделенный сервер даст вам полный контроль над средой продакшна вашего приложения.

nginx и PHP-FPM

PHP, через встроенный в него менеджер процессов FastCGI (FPM), очень хорошо сочетается с nginx, который является легковесным и высокопроизводительным веб-сервером. Он использует меньше памяти, чем Apache и может лучше обрабатывать конкурентные запросы. Это особенно важно на виртуальном сервере, для которого может быть критичен объем используемой памяти.

Apache и PHP

PHP и Apache имеют длинную совместную историю. Apache широконастраиваемый и имеет большое количество доступных модулей для расширения функциональности. Это очень популярный выбор для виртуальных хостингов и лёгкой установки PHP фреймворков и приложений с открытым исходным кодом, как WordPress. К сожалению, Apache использует больше ресурсов, чем nginx, и не может выдержать столько же посетителей одновременно.

Apache имеет несколько возможных конфигураций для запуска PHP. Самая популярная и лёгкая для установки prefork MPM вместе с mod_php5. Хотя это не самое эффективное в отношении памяти решение, оно очень просто для установки и использования. Наверное, это лучшее решение, если вы не хотите углубляться в серверное администратирование. Если вы хотите использовать mod_php5, вы обязаны использовать prefork MPM.

Если вы хотите получить больше производительности и стабильности с Apache, тогда вы можете взглянуть на ту же FPM систему, как в nginx и запустить worker MPM или event MPM, используя mod_fastcgi или mod_fcgid. Эта конфигурация позволит получить существенную экономию в памяти и будет намного быстрее, но потребует больше работы для установки.

Виртуальный хостинг

PHP, благодаря своей популярности, установлен на большом количестве виртуальных хостингов. Очень трудно найти хостинг без установленного PHP, но очень важно убедиться в том, что установлена последняя версия. Виртуальные хостинги позволяют вам и другим разработчикам развертывать веб-сайты на одной машине. Достоинством виртуального хостинга является его низкая цена. Недостатком — то, что вы не знаете, чем будут заниматься ваши соседи; сильно загружая сервер или открывая бреши в безопасности. Если бюджет вашего проекта позволяет избежать использования Виртуальных хостингов, то рассмотрите другие варианты.

Построение и развёртывание вашего приложения

Если вы обновляете структуру базы данных вручную или запускаете вручную тесты перед обновлением ваших файлов, то подумайте дважды! С каждой дополнительной необходимой ручной задачей для развёртывания новой версии вашего приложения, потенциальный шанс возникновения фатальной ошибки возрастает. Делаете ли вы простое обновление, полный процесс сборки или стратегию непрерывной интеграции автоматизация сборки — ваш друг.

Среди задач, которые вы, возможно, захотите автоматизировать:

  • Управление зависимостями
  • Компиляция, минификация файлов (assets)
  • Запуск тестов
  • Создание документации
  • Запаковка
  • Развёртывание

Создание инструментов автоматизации

Инструменты построения — коллекция скриптов, которые обрабатывают общие задачи развёртки приложений. Инструменты постройки не являются частью вашего приложения, они взаимодействуют с вашим приложением «извне».

Существует большое количество инструментов с открытым исходным кодом, которые могут помочь вам автоматизировать процесс постройки, некоторые написаны на PHP, другие на других языках. Это не должно удерживать вас от их использования, если они лучше подходят под задачу. Вот несколько примеров:

Phing самый простой путь, чтобы начать автоматическую развёртку в мире PHP. С Phing вы можете контролировать ваш процесс запаковки, развёртки или тестирования с помощью простого построечного XML файла. Phing (который базируется на Apache Ant) предоставляет богатый набор задач, часто необходимых для установки или обновления веб приложения, и может быть расширен дополнительными нестандартными задачами, написанными на PHP.

Capistrano — система для начинающих-профессиональных разработчиков для исполнения команд в структуризованном, воспроизводимом пути на одной или многих удалённых машинах. Предварительно он настроен для развёртки приложений Ruby on Rails. Как бы то ни было люди успешно развёртывают и PHP приложения с ним. Успех использования Capistrano зависит на умении работы с Ruby и Rake.

Сообщение в блоге Dave Gardner PHP Deployment with Capistrano является хорошей отправной точкой для PHP разработчиков, заинтересованных в Capistrano.

Chef является нечто большим, чем просто фрэймворк развёртки. Это очень мощный интеграционный фрэймворк, основанный на Ruby, который не просто развёртывает ваше приложение, но и может построить всё серверное окружение или виртуальный сервер.

Ресурсы о Chef для PHP разработчиков:

Для дальнейшего изучения:

Непрерывная интеграция

Непрерывная интеграция — это практика разработки программного обеспечения, при которой члены команды объединяют их работу очень часто, обычно каждый член команды объединяет как минимум ежедневно — что приводит к нескольким объединениям в день. Многие команды считают, что данный подход позволяет значительно сократить интеграционные проблемы и позволяет им разрабатывать совместный продукт быстрее.

Существуют разные пути, для осуществления непрерывной интеграции для PHP. Недавно Travis CI закончил великолепную работу по созданию непрерывной интеграции, реально даже для маленьких проектов. Travis CI — сервис непрерывной интеграции для сообщества с открытым исходным кодом. Оно интегрируется с GitHub и предлагает первоклассную поддержку для многих языков, включая PHP.

Для дальнейшего изучения:

Кэширование

PHP очень быстр сам по себе, но такие ресурсоёмкие операции, как установка удалённого подключения и, к примеру, загрузка файлов, могут привести к существенному падению скорости работы приложения. К счастью, есть различные инструменты, позволяющие поднять скорость определённых частей вашего приложения, или уменьшить количество запусков этих «тяжёлых» задач.

Кэширование байткода

Во время исполнения PHP файла, на низком уровне он сперва компилируется в байткод (или опкод) и только потом исполняется байткод. Если PHP файл не изменён, то байткод будет всегда одинаков. Это значит, что шаг компиляции — пустая трата процессорных ресурсов.

И тут настает время кэширования байткода. Оно предотвращает избыточные компиляции, сохраняя в памяти байткод и переиспользуя его в последовательных вызовах. Установка подобного кэширования — вопрос пары минут, а скорость вашего приложения поднимется существенно. Поэтому нет причин не использовать кэширование.

Начиная с PHP 5.5 появилось встроенное расширение для кэширования байткод — OPcache. Оно также доступно в виде отдельного расширения для ранних версий.

Популярные системы подобного кэширования:

  • APC (PHP 5.4 и более ранние)
  • XCache
  • Zend Optimizer+ (часть Zend Server)
  • WinCache (расширение для MS Windows Server)

Кэширование объектов

Бывают моменты, когда вам необходимо кэшировать определённые объекты в вашем коде, такие как данные, которые неразумно получать ещё раз из базы данных, когда результат вряд ли изменится. Вы можете использовать ПО для кэширования чтобы сохранить эти кусочки данных в памяти, что позволит чрезвычайно быстро обратиться к ним позже. Если вы сохраните эти объекты в хранилище данных и после получите их и выдадите напрямую из кэша для некоторых запросов, вы можете получить существенное улучшение производительности и уменьшение нагрузки на сервер базы данных.

Множество популярных решений для кэширования байткода также дают вам кэшировать данные, поэтому нет причин, чтобы не воспользоваться ими. APC, XCache и WinCache предоставляют API для сохранения данных из вашего PHP кода в свой кэш в памяти.

Самыми популярными системами кэширования объектов являются APC и memcached. APC — идеальный выбор для кэширования объектов, он включает простой API для добавления данных в кэш память и при этом очень просто устанавливается и используется. Единственное существующее ограничение APC состоит в том, что он привязан к серверу на котором установлен. Memcached, напротив, устанавливается как отдельный сервис, и к нему можно получить доступ по сети, что позволяет хранить объекты в очень быстром централизованном хранилище данных и множество других систем могут получать эти данные из него.

Учтите, если PHP запущен как (Fast-)CGI приложение внутри вашего веб-сервера, то каждый PHP процесс будет иметь собственный кэш, например, APC данные не будут расшарены между вашими процессами. В этом случае имеет смысл подумать об использовании вместо него memcached, так как он не ограничен процессом PHP.

В сетевой конфигурации APC зачастую выигрывает у memcached в плане скорости доступа, но memcached обладает возможностью масштабироваться быстрее и более широко. Если иметь несколько серверов для обслуживания приложения не входит в ваши планы или вам не нужны дополнительные возможности memcached, тогда APC будет лучшим выбором для кэширования объектов.

Пример использования APC:

Подробнее о популярных системах кэширования объектов:

Список вопросов и задач при собеседовании PHP программиста

Готовясь к прохождению собеседования, PHP программисты часто задаются вопросами: что меня будут спрашивать, какие вопросы и задания могут быть? Вопросы и задачи могут быть абсолютно разными. Здесь нельзя предугадать, что конкретно у вас будут спрашивать, и какое тестовое задание попросят пройти.

В данной статье собраны наиболее часто встречающиеся вопросы и задачи, которые могут попасться на собеседовании и которые PHP программист должен знать.

Основное

Что такое PHP?

PHP — это скриптовый язык программирования для создания сайтов и веб-приложений. PHP унаследовал синтаксис языков программирования C, Perl, Java.

Какие знаешь версии PHP?

Есть следующие версии PHP:

  • PHP 2, PHP 3, PHP 4 старые и не поддерживаемые версии
  • PHP 5 >= используется в большинстве проектов, преимущественно обладает версия 5.6
  • PHP 7 актуальная версия с новыми возможностями и улучшениями

Синтаксис PHP

Что такое short tags и как его использовать в PHP?

Для обработки скрипта все содержимое кода необходимо заключать в открывающие и закрывающие теги и ?> , которые определяют начало и конец обработки. short tags — это короткий синтаксис позволяющий использовать echo использовать = (ровно) Например:

Как изолировать PHP код от HTML? Для чего это нужно?

Изолирование кода необходимо для использования смешанного содержимого скрипта: php, javascript, css и т.п. Изолирование обеспечивает удобство и простоту понимания содержимого скрипта.

Как использовать комментарии в коде PHP?

Комментарии позволяют документировать участки кода в PHP скрипте. Содержимое комментариев не отображается при выполнении скрипта. PHP поддерживает комментарии в следующих стилях:

Однострочные комментарии записываются до конца строки или текущего блока PHP-кода после символов // или # Многострочные комментарии запитываются внутри символов /* и */ Например:

Что такое $this и self в PHP?

$this — является ссылкой на текущий объект. self — является ссылкой на текущий класс.

В чем разница между одинарными и двойными кавычками в PHP?

В отличии от одинарных, данные в двойных кавычках парсятся.Например, при использовании двойных кавычек результат выведет Hello, а одинарные кавычки выведут переменную как текст, а не ее значение:

Типы данных PHP

Сколько в PHP типов данных? Какие это типы данных?

В PHP есть 8 базовых типов данных

4 скалярных типа:

  • boolean — логический тип true/false
  • integer — целочисленный тип
  • float — числовой тип с плавающей точкой, содержащий целые и дробные числа
  • string — строковый тип

2 составных типа:

  • array — массив с упорядоченным списком элементов
  • object — объект

2 специальных типа:

  • resource — ссылка на внешний (абстрактный) ресурс.
  • NULL — пустой тип, без значения

Какой тип типизации данных в PHP?

В PHP используется динамическая типизация, не требующая объявления переменной и указания ее типа при объявлении.

Что такое переменная и как ее использовать?

Переменная это именованная область в памяти для хранения данных. Имя переменной должно начинаться с буквы или символа подчеркивания, состоять из букв, цифр и символов подчеркивания. Перед именем переменной необходимо использовать символ $ .

Что такое область видимости переменной?

Область видимости переменной, это место в котором переменная определена. Например, внутри функции или за ее пределом.

Что такое переменные извне?

Переменные извне — это данные полученные из формы с помощью GET и POST, данные полученные из COOKIE.

В чем разница между GET и POST?

GET передает данных из адресной строки в виде строки с параметрами. POST передает данные используя HTTP тело запроса (например, обычно через html форму). GET может передавать только данные объемом 1024 символов. POST может отправлять данные большого размера, который обычно установлен в настройках сервера.

Константы

Что такое константы? Как их использовать?

Константы — это уникальное имя, которое содержит какие-то данные. Константы можно использовать двумя способами:

Что такое волшебные константы?

Волшебные константы — это список предопределенных в PHP констант. Существуют следующие волшебные константы

Текущий номер строки в файле.

Полный путь и имя текущего файла с развернутыми симлинками. Внутри подключаемого файла возвращается имя данного файла.

Директория файла. Внутри подключаемого файла возвращается директория этого файла.

Имя функции или в случае анонимной функции.

Имя класса, содержит название пространства имен, в котором класс был объявлен (например, Block\Aside).

Имя трейта, содержит название пространства имен, в котором трейт был объявлен (например, Block\Aside).

Имя метода класса.

Имя текущего пространства имен.

Полное имя класса (с указанием пространства имен).

Операторы PHP

Что такое оператор?

Оператор — это одно или несколько выражений, используемых для выполнения определенных действий.

Какие существуют операторы?

В PHP есть следующие виды операторов:

  • оператор присваивания
  • арифметические операторы
  • логические операторы
  • побитовые операторы
  • операторы сравнения
  • оператор управления ошибками
  • операторы инкремента и декремента
  • строковые операторы
  • операторы массивов
  • оператор проверки типа

Что такое арифметические операторы?

Арифметические операторы это простейшие математические операции: идентичность, отрицание, сложение, вычитание, умножение, деление, деление по модулю, возведение в степень.

Что такое логические операторы?

Логические операторы используются для проверки истинности или ложности каких-либо действий или условий. Есть следующие логические операторы:

Что такое оператор присваивания?

Оператор присваивания обозначается знаком = и позволяет указать для переменной новое значение.

Что такое побитовые операторы?

Побитовые операторы это операции производимые над цепочкой битов.

Что такое операторы сравнения?

Операторы сравнения используются для сравнения значений переменных между собой.Существуют следующие операторы сравнения:

Тождественно не равно

Больше или равно

Космический корабль (spaceship)

Что такое оператор управления ошибками?

Оператор управления ошибками обозначается знаком @ и позволяет игнорировать вывод ошибок для используемых функций.

Что такое операторы исполнения?

Оператор исполнения позволяет выполнить строку, заключенную в кавычки « и возвращает полученный вывод. Например:

Что такое операторы инкремента и декремента?

Операторы инкремента и декремента позволяют увеличить и уменьшить значение переменной на 1 (единицу). PHP поддерживает префиксные и постфиксные операторы инкремента и декремента в стиле C.Например:

Увеличивает $a на единицу, затем возвращает значение $a.

Возвращает значение $a, затем увеличивает $a на единицу.

Уменьшает $a на единицу, затем возвращает значение $a.

Возвращает значение $a, затем уменьшает $a на единицу.

Что работает быстрей: преинкремент или постинкремент?

Преинкремент работает быстрее, изменяя содержимое самой переменной, в то время как постинкремент создает временную переменную.

Что такое строковые операторы?

Строковые операторы позволяют работать с текстом. Оператор конкатенации (‘.’) соединяет в строку левый и правый аргументы. Оператор присваивания с конкатенацией (‘.=’), соединяет в строку правый аргумент к левому.

Что делает оператор проверки типа?

Оператор проверки типа instanceof используется чтобы определить, является ли текущий объект экземпляром указанного класса.

Управляющие конструкции

Обязательно ли использовать закрывающий тег ?> в конце файла?

Нет, не обязательно. В файлах, где только PHP код, его лучше не использовать, чтобы предотвратить случайное попадание конечного пробела в вывод.

В чем разница между require(), require_once(), include(), include_once()?

  • require() просто подключает в текущий файл указанный
  • require_once() подлключает указанный файл в текущий только в том случает, если он не был ранее подключен
  • include() работает также как и require(), подключает файл и в случае ошибки возвращает WARNING, в то время как require() возвращает FATAL ERROR
  • include_once() работает также как и require_once(), подключает файл если он не был ранее подключен и возвращает WARNING, в то время как require_once() возвращает FATAL ERROR.

В чем отличие цикла while от do while?

Тело цикла do-while выполнится хотя бы один раз, так как условие проверяется в конце цикла, в то время как в цикле while условие проходит проверку вначале.

Что такое goto и как он работает?

Оператор goto обеспечивает переход из одной части программы в другую. Место в которое производится переход указывается с помощью специальной метки с двоеточием. Для перехода к этому месту используют оператор goto и название метки.

В чем различия между операторами break и continue?

Оператор break прерывает выполнение инструкций for, foreach, while, do-while или switch, а опратор continue пропускает часть итерации внутри цикла.

Как прервать выполнение for, foreach, while, do-while или switch?

Прервать выполнение инструкций for, foreach, while, do-while или switch возможно с помощью оператора break .

Как пропустить часть интерации цикла внутри for, foreach, while, do-while или switch?

Пропустить часть интерации цикла внутри for, foreach, while, do-while или switch возможно с помощью оператора continue .

Что такое declare?

Оператор declare производит установку директив исполнения для блока кода.

Почему в declare нельзя использовать переменные и константы?

В declare нельзя использовать переменные и константы, потому что директивы обрабатываются во время компиляции файла и только символьные данные могут использоваться в значении declare.

Что такое альтернативный синтаксис?

Альтернативный синтаксис используется для операторов if, while, for, foreach и switch и позволяет изменить запись выражения, использовав вместо открывающей фигурной скобки двоеточие (:), а вместо закрывающей скобки endif;, endwhile;, endfor;, endforeach; или endswitch;

Строки

Есть ли разница между одинарными и двойными кавычками?

Переменные заключенные в двойные кавычки парсятся и их содержимое выводится, в то время как в одинарных кавычках просто отобразят название переменной как обычный текст.

В чем различия между echo и print?

Оба оператора используются для вывода текста. echo() является конструкцией, которая может принимать несколько аргументов и выводить их на экран. print() не совсем функция и может принимать только 1 аргумент, а также писаться без скобок.

Дана строка «Hello world!». Как перевернуть строку?

Чтобы перевернуть строку, можно использовать функцию strrev()

Массивы

Как удалить переменную или элемент из массива?

Для удаления переменной или элемента из массива надо использовать функцию unset(). Например:

Дан массив [1,2,3,4,5,6,7]. Как перевернуть его и получить [7,6,5,4,3,2,1]?

Чтобы перевернуть массив, можно использовать функцию array_reverse()

Как получить максимальное значение элемента массива [1,2,3,4,5,10,20,30,40,50,70,100, 10, 30, 50]?

Для получения максимального значения массива можно использовать функцию max() .

Либо сделать это через цикл:

Функции

Что такое функция?

Функция — это набор операторов, выполняющих определенные действия. Функция начинается с ключевого слова function , за которым следует имя функции, а за ней круглые скобки с передаваемыми параметрами внутрь функции.

Что такое аргументы функции?

Аргументы функции это данные, передаваемые внутрь функции в виде списка параметров. Аргументы разделяются запятыми и вычисляются слева на право.

Какие существуют способы передачи аргументов в функцию?

Передача аргументов в функцию осуществляется: по значению (часто используемый), по ссылке, значения по умолчанию.

Как просиходит передача аргументов в функцию по значению?

Передача аргументов в функцию по ссылке происходит с помощью указания новых аргументов внутри вызываемой функции.

Как происходит передача аргументов в функцию по ссылке?

Передача аргументов в функцию по ссылке происходит с помощью указания амперсанда ( & ) перед именем аргумента в описании функции.

Как для функции просиходит установка значений по умолчанию?

Установка значений по умолчанию для функции просиходит с помощью указания значений для аргументов функции.

Какой оператор производит возврат результата функции?

Возрат результата функции производится с помощью оператора return .

Как происходит обращение к функциям через переменные?

Обращение к функциям через переменные происходит с помощью присоединения к имени переменной круглых скобок. PHP будет искать функцию с таким именем и пытаться ее выполнить.

Что такое ананимные функции?

Анонимная функция, или по другому, замыкания (closures), представляет собой функцию не имеющую имени и используемую для значений callback-параметров.

Что такое static функция?

Static функция вызывается напрямую у класса и позволяет обращаться к свойствам и методам класса без создания экземпляра класса. При этом указатель $this не доступен внутри метода объявленного статическим.

Что такое рекурсия?

Рекурсия — это вызов функции из самой себя.

Классы и объекты

Что такое объектно-ориентированное программирование?

Объектно-ориентированное программирование — это парадигма программирования с использованием объектов и классов.

Что такое MVC?

MVC (Model-View-Controller) схема шаблона проектирования, разделенный на три компонента для работы с базой данных, интерфейсом отображения данных, взаимосвязью приложения с пользователем. Модель отвечает за работу с информацией из базы данных. Представление отвечает за отображение полученной информации на экран. Контроллер отвечает за взаимодействие между данными и отображением.

Что такое конструктор?

Конструктор это метод _constructor(), который вызывается при создании экземпляра класса с помощью ключевого слова new.

Как в PHP сделать множественное наследование?

В PHP нельзя сделать множественное наследование. У класса может быть только один родитель. Для эмуляции множественного наследования можно использовать функцию _call() или трейты (traits). Трейт позволяет группировать и повторно использовать наборы методов в нескольких классах.

Назовите основные концепции объектно-ориентированного программирования

Основными концепциями объектно-ориентированного программирования являются: инкапсуляция, наследование, полиморфизм. Инкапсуляция объединяет методы и данные и защищает от внешнего вмешательства или неправильного использования. Наследование позволяет одному объекту наследовать методы и свойства другого объекта. Полиморфизм создает общий интерфейс для схожих по смыслу действий, чтобы решать множество разных задач.

Что такое виртуальный метод?

Виртуальный метод является переопределенным методом класса в классах-наследниках для вызова во время исполнения.

Что такое класс?

Класс это модель еще не существующего объекта, описывающая устройство бъекта — его методы и свойства.

Что такое объект?

Объект это данные и методы для их обработки.

Что такое члены класса?

Членами класса называют данные и методы объекта.

В чем отличие класса от объекта?

Объект является экземпляром типа класса. Класс является типом данных.

Что такое область видимости переменной?

Область видимости переменной — это область, в пределах которой метод или переменная продолжает работать и возвращать значение.

Есть несколько типов определяемых область видимости методов и переменных:

  • public — переменная доступна из любого места
  • protected — защищенная переменная доступна только внутри класса, в котором была объявлена и из производных классов
  • private — закрытые методы и переменные доступны только внутри класса

В чем отличие локальной переменной от глобальной переменной?

Локальные переменные доступны только в конкретном методе, а глобальные во всей программе.

Что такое абстрактный класс?

Абстрактный класс в объектно-ориентированном программировании — это базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Абстрактный класс может содержать (и не содержать) абстрактные методы и свойства.

В чем разница между абстрактным классом и интерфейсом?

Абстрактный класс — имеет хотя бы один метод и обозначается как abstract . Интерфейс — это тоже абстрактный класс, но он не может иметь свойств, и не определено содержимое методов.

Зачем интерфейс, когда есть абстрактный класс?

Произвести наследование можно только от одного абстрактного класса, но реализовать множество интерфейсов. Абстрактный класс наследуется, а интерфейс реализуется.

Пространства имен

Что такое пространства имен?

Пространства имен — это объединение элементов (классов) с уникальными названиями в одну группу и их защита от внешнего вмешательства (инкапсулирование) внутри единого пространства с указанным именем.

Какие проблемы решает пространство имен?

Пространство имен решает проблемы конфликта имен классов, функций, констант и длинных имен различных библиотеки и модулей.

Как объявляются пространства имен?

Пространства имен объявляются с помощью ключевого слова namespace .

Как получить название пространства имен?

Получить название пространства имен можно с помощью магической константы __NAMESPACE__ .

Что такое use?

Ключевое слово use позволяет импортировать файл или каталог.

Что такое псевдоним имени?

Псевдоним имени — это указание короткого имени для импортируемого пути к файлу или каталогу.

Исключения

Что такое исключения?

Исключения позволяют сделать обработку ошибок в PHP: сгенерировать или поймать.

Генераторы

Что такое генераторы?

Генератор — это простая функция обозначаемая как yield (похожа на простые итераторы) и вместо возращения значения, как это делает return , будет перебирать все значения.

Что такое yield?

Ключевое слово yield используется при создании генератора для перебора значений и вместо возращения значения, как это делает return , перебирает все значения.

Ссылки

Что такое ссылка?

Ссылка — это доступ к переменной под разными именами.

Что делают ссылки?

Ссылки обеспечивают выполнение следующих операций: присвоение по ссылке, передачу по ссылке и возврат по ссылке.

Что не делают ссылки?

Ссылки не являются указателями на данные.

Cookie

Что такое Cookie и зачем они используются?

Cookie (Печеньки) — это небольшой фрагмент информации передаваемый в браузер и хранящийся на компьютере пользователя. Cookie используется для хранения необольшой информации, а также используется при аутентификации пользователей сайта, установки различных настроек и ведении статистики о сайте.

Что нельзя хранить в Cookie и почему?

В cookie ни в коем случае нельзя хранить конфендициальные данные, например: пароли, номера карт, а также делать проверку подленности пользователя к аккаунтам Это связано с тем, что содержимое cookie может быть легко просмотрено и изменено через браузер любым пользователем.

Какие есть типы cookie?

Есть следующие типы cookie: сессионные, постоянные, защищенные, HTTP-only. Сессионные (временные) — существуют только когда пользователь зашел на сайт, а при закрытии браузера уничтожаются. Постоянные — существуют все время и удаляются только в установленную дату или промежуток времени. Защищенные — куки могут быть переданы только через шифрованное HTTPS соединение. HTTP-only — к кукам нельзя обращаться из браузера через JavaScript, что устраняет их кражу через кросс-сайтового скриптинга (XSS).

Сессии

Что такое сессии и зачем они используются?

Сессии — это специальные файлы на сервере для хранения и доступа различных данных. Сессии позволяют хранить данные, к которым через браузер пользователь не может получить доступ, например, как в cookie. Посетителю сайта присваивается уникальный id (идентификатор сессии), который хранится в cookie на стороне пользователя или передается через адресную строку.

Вопросы MySQL

Где и как нужно хранить пароли пользователей сайта?

Пароли пользователей сайта необходимо хранить в базе данных в защищенном виде хэшировав их с помощью: sha1(), crypt(), password_hash().

Как получить одинаковые значения в поле MySQL?

Есть таблица product . Необходимо получить все одинаковые значения из поля vendor .

Возможности скриптового языка PHP для разработки интернет-приложений

PHP является языком программирования с открытым исходным кодом, разработанным для написания сценариев, которые исполняются на стороне WEB-сервера.

PHP означает «Препроцессор Гипертекста» (Hypertext Preprocessor). Синтаксис языка основан на Perl, Java и С. PHP представляет собой достаточно простой язык, он легок в изучении. Достоинством PHP является то, что он предоставляет WEB-мастерам возможность создания динамических (сгенерированных) HTML-страниц.

Основным преимуществом PHP перед такими языками как С и Perl является то, что с помощью PHP могут создаваться HTML-страницы с командами PHP, внедренными в HTML-документ.

Скрипты PHP исполняются на стороне сервера в отличие от скриптов, исполняемых на стороне клиента, в частности, скриптов на JavaScript. WEB-сервер может быть настроен таким образом, чтобы процессор PHP обрабатывал HTML-страницы: при этом пользователи не могут знать, статические или динамические HTML-страницы они получают.

Язык сценариев PHP позволяет в короткие сроки разрабатывать качественные WEB-приложения, которые в будущем могут поддерживаться и при необходимости легко модифицироваться.

PHP прост для изучения и одновременно является мощным инструментом профессиональных программистов. Изучить PHP не трудно даже в том случае, если Вы слышите о нем первый раз в жизни. Уже несколько часов, потраченных на изучение PHP, будут достаточны для написания простых скриптов на PHP.

PHP доминирует среди языков программирования для Интернета и при этом постоянно совершенствуется.

Язык сценариев PHP обладает чрезвычайно большими возможностями. Основная область применения PHP- создание скриптов, исполняемых сервером. Благодаря этому скрипт на PHP может выполнять то, что исполняют программы CGI. В частности, PHP позволяет обрабатывать данные форм, принимать и отсылать файлы cookies, а также генерировать динамические HTML-страницы. Кроме этого, скриптовый язык PHP обеспечивает выполнение огромного множества других задач WEB-программирования.

Три основные области применения PHP.

1. Написание скриптов, исполняемых на стороне сервера. Это ключевая область применения PHP. Для реализации задачи необходим WEB-сервер, браузер, а также парсер PHP, который может быть в виде серверного модуля или программы CGI. Для просмотра результатов исполнения в браузере скриптов, написанных на PHP, необходим WEB-сервер и установленный на нем PHP.

2. Написание скриптов, которые могут исполняться в командной строке независимо от WEB-сервера и даже браузера. Для реализации такой задачи необходим только парсер PHP. Такие скрипты широко используются для обработки текстов. Кроме того, указанный способ запуска применяется для регулярно исполняемых скриптов, в частности, с помощью планировщиков задач Task Scheduler под Windows или cron под Linux или *nix.

3. Разработка приложений GUI, которые исполняются на стороне клиента. Существуют скриптовые языки программирования, специально разработанные для таких задач, однако такая возможность для PHP очень удобна для WEB-мастеров, активно работающих с PHP и знающих его в совершенстве. Для этого может использоваться PHP-GTK. Аналогичным образом могут создаваться также кроссплатформенные приложения. PHP-GTK не включается в дистрибутив PHP, а является расширением PHP.

Язык программирования PHP используется под самыми разными операционными системами, в том числе Microsoft Windows, GNU Linux, Unix, Mac OS X, RISC OS, OS/2 и многих других. PHP поддерживает все наиболее распространенные WEB-серверы, в частности, Apache, Personal Web Server, Microsoft Internet Information Server, Netscape, Oreilly Website Pro, iPlanet, OmniHTTPd, Xitami, Caudium, и другие. Чаще всего PHP включается в дистрибутив сервера в качестве модуля. В поставках некоторых серверов, которые поддерживают CGI-стандарт, PHP работает как процессор CGI.

Таким образом, PHP предоставляет свободу выбора как WEB-сервера, так и операционной системы. PHP также позволяет выбирать объектно-ориентированным и процедурным программированием или сочетать и то, и другое.

PHP поддерживает функции перевода, календарных вычислений, функции обработки сжатых файлов (bz2, gzip), функции IRC Gateway, функции mnoGoSearch (функции поисковой машины) и многие другие функции.

Средства обработки текстовой информации также входят в PHP, в частности, парсер XML-документов и регулярные выражения POSIX Extended или Perl . Стандарты SAX и DOM используются для XML-парсинга XML. XSLT-расширение используется для преобразования XML-документов.

Язык сценариев PHP позволяет не только создавать HTML-код. PHP также позволяет формировать файлы PDF, изображения и даже создавать «на лету» Flash-ролики, для чего могут использоваться Ming и libswf. Кроме того, PHP позволяет выдавать XML, XHTML-файлы и любые другие текстовые данные. Язык PHP позволяет выполнять автоматическую генерацию указанных файлов. Вместо того, чтобы отдавать сгенерированные файлы клиенту, PHP позволяет сохранять их на сервере в его файловой системе, формируя при этом на стороне сервера кеш с динамическим содержанием.

С помощью таких протоколов, как HTTP, POP3, NNTP, SNMP, LDAP, IMAP, COM (под Windows) и других протоколов язык PHP поддерживает совместимость с другими сервисами. Доступ к удаленным объектам может осуществляться путем использования расширения CORBA. PHP позволяет «напрямую» работать с сетевыми сокетами. Этот язык также поддерживает стандарт WDDX (стандарт обмена сложными структурами данных) и объекты Java, позволяя использовать такие объекты в качестве PHP-объектов.

Одно из главных преимуществ PHP — это поддержка баз данных в широком диапазоне их разнообразия. PHP позволяет без труды написать скрипт, который использовал бы базы данных. Базы данных, которые поддерживаются PHP в настоящее время:

Adabas D, dBase, Direct MS-SQL, Empress, FilePro (только чтение), FrontBase, Hyperwave,

IBM DB2, Informix, Ingres, InterBase, mSQL, MySQL, ODBC, Oracle (OCI7 и OCI8), Ovrimos, PostgreSQL, Solid, Sybase, Unix dbm, Velocis.

PHP также поддерживает абстрактный уровень работы с DBX, который обеспечивает работу с любой базой данных, которая использует DBX. Помимо этого, поддержка работы с Open Database Connection Standard (ODBC) позволяет работать с любой базой данных, которая поддерживает стандарт ODBC, являющийся признанным стандартом во всем мире.

Топ-пост этого месяца:  Новый отчет Яндекс.Метрики с данными о каждом пользователе
Добавить комментарий