An open API service indexing awesome lists of open source software.

https://github.com/maksimdzhangirov/php-roadmap

PHP. Дорожная карта. Что нужно знать, чтобы стать backend-разработчиком
https://github.com/maksimdzhangirov/php-roadmap

clean-architecture design-patterns oop php roadmap

Last synced: about 1 year ago
JSON representation

PHP. Дорожная карта. Что нужно знать, чтобы стать backend-разработчиком

Awesome Lists containing this project

README

          

# PHP. Дорожная карта

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

https://www.buymeacoffee.com/maxdzhan

---------------------------------------------------------------------------

## [Дорожная карта бекенд-разработчика](https://roadmap.sh/backend)
## [Самоучитель по компьютерным наукам](https://github.com/ossu/computer-science)
## [Список PHP библиотек, ресурсов и т.д. для решения различных задач, сгруппированный по темам](https://github.com/ziadoz/awesome-php)

---------------------------------------------------------------------------

## Что такое Backend-разработка?

Backend-разработка — это часть веб-разработки, которая касается серверной части веб-приложения. Сюда входит создание и управление серверной логикой, подключение приложения к базе данных, создание серверных API, реализация аутентификации и авторизации пользователей, а также обработка и ответ на запросы пользователей. Это часто предполагает использование таких языков программирования, как Python, Java, Ruby, PHP, JavaScript (Node.js) и .NET.

## Чем занимается Backend-разработчик?

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

## Интернет
### Как работает интернет?

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

Полезные ссылки:

* [Википедия](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82)
* [Как работает Интернет](https://developer.mozilla.org/ru/docs/Learn/Common_questions/How_does_the_Internet_work)
* [How does the Internet Work?](https://cs.fyi/guide/how-does-internet-work)
* [The Internet Explained](https://www.vox.com/2014/6/16/18076282/the-internet)
* [How Does the Internet Work?](http://web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htm)
* [Introduction to Internet](https://roadmap.sh/guides/what-is-internet)
* [How does the Internet work?](https://www.youtube.com/watch?v=x3c1ih2NJEg)
* [How the Internet Works in 5 Minutes](https://www.youtube.com/watch?v=7_LPdttKXPc)

### Что такое HTTP?

HTTP – это протокол прикладного уровня на основе `TCP/IP`, который стандартизирует взаимодействие клиента и сервера друг с другом. Он определяет, как контент запрашивается и передается через Интернет.

Полезные ссылки:

* [Википедия](https://ru.wikipedia.org/wiki/HTTP)
* [Everything you need to know about HTTP](https://cs.fyi/guide/http-in-depth)
* [What is HTTP?](https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/)
* [Full HTTP Networking Course](https://www.youtube.com/watch?v=2JYT5f2isg4)
* [An overview of HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview)
* [HTTP/3 From A To Z: Core Concepts](https://www.smashingmagazine.com/2021/08/http3-core-concepts-part1/)
* [HTTP/1 to HTTP/2 to HTTP/3](https://www.youtube.com/watch?v=a-sBfyiXysI)
* [HTTP Crash Course & Exploration](https://www.youtube.com/watch?v=iYM2zFP3Zn0)

### Что такое браузер и как он работает

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

Полезные ссылки:

* [Как работают браузеры](https://developer.mozilla.org/ru/docs/Web/Performance/How_browsers_work)
* [How Browsers Work](https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/)
* [Role of Rendering Engine in Browsers](https://www.browserstack.com/guide/browser-rendering-engine)

### DNS и как они работают

Система доменных имен (DNS) – это телефонная книга Интернета. Пользователи получают доступ к информации в Интернете через доменные имена, например, nytimes.com или espn.com. Веб-браузеры, напротив, взаимодействуют через IP-адреса. DNS переводит доменные имена в IP-адреса, чтобы браузеры могли загружать интернет-ресурсы.

Полезные ссылки:

* [Что такое DNS?](https://aws.amazon.com/ru/route53/what-is-dns/)
* [What is DNS? | How DNS works](https://www.cloudflare.com/en-gb/learning/dns/what-is-dns/)
* [How DNS works (comic)](https://howdns.works/)
* [Understanding Domain names](https://developer.mozilla.org/en-US/docs/Glossary/DNS/)
* [DNS and How does it Work?](https://www.youtube.com/watch?v=Wj0od2ag5sk)
* [DNS Records](https://www.youtube.com/watch?v=7lxgpKh_fRY)
* [Complete DNS mini-series](https://www.youtube.com/watch?v=zEmUuNFBgN8&list=PLTk5ZYSbd9MhMmOiPhfRJNW7bhxHo4q-K)

### Что такое доменные имена

Доменное имя – это уникальный, легко запоминающийся адрес, используемый для доступа к веб-сайтам, таким как «google.com» и «facebook.com». Пользователи могут подключаться к веб-сайтам, используя доменные имена, благодаря системе DNS.

Полезные ссылки:

* [Что такое доменные имена](https://developer.mozilla.org/ru/docs/Learn/Common_questions/What_is_a_domain_name)
* [What is a Domain Name? | Domain name vs. URL](https://www.cloudflare.com/en-gb/learning/dns/glossary/what-is-a-domain-name/)
* [A Beginners Guide to How Domain Names Work](https://www.youtube.com/watch?v=Y4cRx19nhJk)

### Что такое хостинг?

Веб-хостинг – это онлайн-сервис, который выдаёт файлы вашего веб-сайта в Интернете. Таким образом, любой, кто имеет доступ к Интернету, имеет доступ к вашему сайту.

Полезные ссылки:

* [Википедия](https://ru.wikipedia.org/wiki/%D0%A5%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3)
* [What Is Web Hosting? Explained](https://www.youtube.com/watch?v=htbY9-yggB0)
* [Different Types of Web Hosting Explained](https://www.youtube.com/watch?v=AXVZYzw8geg)
* [Where to Host a Fullstack Project on a Budget](https://www.youtube.com/watch?v=Kx_1NYYJS7Q)
* [What is the difference between webpage, website, web server, and search engine?](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/Pages_sites_servers_and_search_engines)
* [What is a web server?](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_web_server)

## Базовые знания из фронтенд разработки
### HTML

HTML (**H**yper**T**ext **M**arkup **L**anguage – «язык гипертекстовой разметки») – стандартизированный язык гипертекстовой разметки документов для просмотра веб-страниц в браузере. Веб-браузеры получают HTML документ от сервера по протоколам HTTP/HTTPS или открывают с локального диска, далее интерпретируют код в интерфейс, который будет отображаться на экране монитора.

Элементы HTML являются строительными блоками HTML страниц. С помощью HTML разные конструкции, изображения и другие объекты, такие как интерактивная веб-форма, могут быть встроены в отображаемую страницу. HTML предоставляет средства для создания заголовков, абзацев, списков, ссылок, цитат и других элементов. Элементы HTML выделяются тегами, записанными с использованием угловых скобок. Такие теги, как `` и ``, напрямую вводят контент на страницу. Другие теги, такие как `

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

Язык XHTML является более строгим вариантом HTML, он следует синтаксису XML и является приложением языка XML в области разметки гипертекста.

В HTML можно встроить программный код на языке программирования JavaScript, для управления поведением и содержанием веб-страниц. Также включение CSS в HTML позволяет задавать внешний вид и макет страницы.

Полезные ссылки:

* [HTML Introduction](https://www.w3schools.com/html/html_intro.asp)
* [HTML](https://ru.wikipedia.org/wiki/HTML)

### CSS

CSS (**C**ascading **S**tyle **S**heets – «каскадные таблицы стилей») – формальный язык декорирования и описания внешнего вида документа (веб-страницы), написанного с использованием языка разметки (чаще всего HTML или XHTML). Также может применяться к любым XML-документам, например, к SVG или XUL.

Полезные ссылки:

* [CSS](https://ru.wikipedia.org/wiki/CSS)
* [CSS Introduction](https://www.w3schools.com/css/css_intro.asp)

### Javascript

JavaScript – мультипарадигменный язык программирования. Поддерживает объектно-ориентированный, императивный и функциональный стили. Является реализацией спецификации ECMAScript (стандарт ECMA-262).

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

Полезные ссылки:

* [Javascript](https://ru.wikipedia.org/wiki/JavaScript)
* [JavaScript Introduction](https://www.w3schools.com/js/js_intro.asp)
* [Современный учебник JavaScript](https://learn.javascript.ru/)

### Смотри также [дорожную карту фронтенд разработчика](https://roadmap.sh/frontend)

## ОС и общие знания

Операционная система – это программа, которая управляет ресурсами компьютера, особенно распределением этих ресурсов между другими программами. Примерами ресурсов могут быть центральный процессор (ЦП), память компьютера, хранилище файлов, устройства ввода/вывода (I/O) и сетевые подключения.

Полезные ссылки:

* [What is an operating system?](https://edu.gcfglobal.org/en/computerbasics/understanding-operating-systems/1/)
* [Operating System summary](https://www.guru99.com/os-tutorial.html)
* [Operating Systems: Crash Course Computer Science #18](https://www.youtube.com/watch?v=26QPDBe-NB8&ab_channel=CrashCourse)
* [Introduction to Operating System](https://www.youtube.com/watch?v=vBURTt97EkA&list=PL9hkZBQk8d1zEGbY7ShWCZ2n1gtxqkRrS&index=1)

### Использование терминала

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

Полезные ссылки:

* [Terminal Usage](https://www.cs.cmu.edu/~15131/f17/topics/terminal-usage/)
* [Command line crash course](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Command_line)
* [Basic Terminal Usage – Cheat Sheet to make the command line EASY](https://www.youtube.com/watch?v=jDINUSK7rXE)

#### Базовые команды терминала

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

Лучший способ выучить эти команды – попрактиковаться с их использованием на своем компьютере/в локальной среде разработки. Обратите внимание на те, которые связаны с командами/утилитами Linux, являющейся наиболее распространенной ОС в отрасли.

Чтобы понять как работают эти команды, прочитайте соответствующие страницы документации и руководств по эксплуации, используя команду man, например, `man grep`, `man awk` и т. д.

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

* [grep](https://www.geeksforgeeks.org/grep-command-in-unixlinux/),
* [awk](https://www.geeksforgeeks.org/awk-command-unixlinux-examples/),
* [sed](https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/),
* [lsof](https://www.geeksforgeeks.org/lsof-command-in-linux-with-examples/),
* [curl](https://www.geeksforgeeks.org/curl-command-in-linux-with-examples/),
* [wget](https://linuxize.com/post/wget-command-examples/),
* [tail](https://www.geeksforgeeks.org/tail-command-linux-examples/),
* [head](https://www.geeksforgeeks.org/head-command-linux-examples/),
* [less](https://www.geeksforgeeks.org/less-command-linux-examples/),
* [find](https://www.geeksforgeeks.org/find-command-in-linux-with-examples/),
* [ssh](https://www.ssh.com/academy/ssh/command),
* [kill](https://www.geeksforgeeks.org/kill-command-in-linux-with-examples/)
* [dig](https://www.geeksforgeeks.org/dig-command-in-linux-with-examples/)

Полезные ссылки:

* [Command line crash course](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Command_line)
* [40 Basic Linux Commands](https://www.hostinger.com/tutorials/linux-commands)
* [A collection of modern/faster/saner alternatives to common unix commands](https://github.com/ibraheemdev/modern-unix)
* [Command Line Tutorial](https://www.learnenough.com/command-line-tutorial)
* [Commandline Challenge](https://cmdchallenge.com/)
* [The 50 Most Popular Linux & Terminal Commands (with timestamps)](https://www.youtube.com/watch?v=ZtqBQ68cfJc)

### Общий принцип работы ОС

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

Полезные ссылки:

* [What is an operating system?](https://edu.gcfglobal.org/en/computerbasics/understanding-operating-systems/1/)
* [Operating System – Overview](https://www.tutorialspoint.com/operating_system/os_overview.htm)
* [Operating System Concepts](https://codex.cs.yale.edu/avi/os-book/OS10/index.html)
* [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8)

### Управление процессами

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

Полезные ссылки:

* [Processes and Process Management](https://www.omscs-notes.com/operating-systems/processes-and-process-management/)
* [Operating System: Process and Process Management](https://medium.com/@akhandmishra/operating-system-process-and-process-management-108d83e8ce60)
* [Process Management in OS: PCB in Operating System](https://www.guru99.com/process-management-pcb.html)

### Потоки и многопоточность

Поток выполнения – это наименьшая единица обработки, которая может быть выполнена в ОС. В большинстве современных операционных систем поток существует внутри процесса, то есть один процесс может содержать несколько потоков.

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

Полезные ссылки:

* [Threads And Concurrency](https://www.omscs-notes.com/operating-systems/threads-and-concurrency/)
* [What’s the Diff: Programs, Processes and Threads](https://www.backblaze.com/blog/whats-the-diff-programs-processes-and-threads/)
* [Concurrency in Operating System](https://www.javatpoint.com/concurrency-in-operating-system)
* [Intro to Processes & Threads](https://www.youtube.com/watch?v=exbKr6fnoUw)
* [Introduction to Concurrency](https://www.youtube.com/watch?v=iKtvNJQoCNw)
* [Concurrency, Threading and Parallelism Explained](https://www.youtube.com/watch?v=olYdb0DdGtM)

### Управление памятью

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

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

Полезные ссылки:

* [Memory Management](https://www.omscs-notes.com/operating-systems/memory-management/)
* [Demystifying memory management in modern programming languages](https://dev.to/deepu105/demystifying-memory-management-in-modern-programming-languages-ddd)
* [Memory Management in Operating System](https://www.geeksforgeeks.org/memory-management-in-operating-system/)

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

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

Полезные ссылки:

* [Inter-Process Communication](https://www.omscs-notes.com/operating-systems/inter-process-communication/)
* [Interprocess Communication](https://www.geeksforgeeks.org/inter-process-communication-ipc/)
* [Interprocess Communication – Neso Academy](https://www.youtube.com/watch?v=dJuYKfR8vec)

### Управление вводом/выводом

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

Полезные ссылки:

* [IO Management](https://www.omscs-notes.com/operating-systems/io-management/)
* [Operating System – I/O Hardware](https://www.tutorialspoint.com/operating_system/os_io_hardware.htm)
* [Basics of OS (I/O Structure)](https://www.youtube.com/watch?v=F18RiREDkwE)

### Основы POSIX (stdin, stdout, stderr, pipes)

POSIX (Portable Operating System Interface – переносимый интерфейс операционных систем) – это набор стандартов для обеспечения совместимости между операционными системами. В нём описываются утилиты, API и службы, которые совместимая ОС должна предоставлять программному обеспечению, что упрощает перенос программ из одной системы в другую.

Практический пример: в Unix-подобной операционной системе существует три **стандартных потока**, `stdin`, `stdout` и `stderr` — это подключения ввода/вывода, с которыми вы, вероятно, столкнетесь при использовании терминала, поскольку они управляют потоком из *стандартного ввода* (stdin), *стандартного вывода* (stdout) и *стандартной ошибки* (stderr).

Таким образом, когда мы хотим взаимодействовать с любым из этих потоков (например, через процесс), API POSIX операционной системы позволяет упростить этот процесс — например, в библиотеке на языке C `` stdin, stderr и stdout определены как `STDIN_FILENO`, `STDERR_FILENO` и `STDOUT_FILENO`.

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

Полезные ссылки:

* [Стандартные потоки](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8)
* [Pipes](https://sodocumentation.net/posix/topic/8082/pipes)
* [POSIX standard by IEEE](https://pubs.opengroup.org/onlinepubs/9699919799/)
* [Summary of some POSIX implementations](https://unix.stackexchange.com/a/220877)
* [A guide to POSIX](https://www.baeldung.com/linux/posix)

### Основные прицнипы работы компьютерной сети

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

Полезные ссылки:

* [Basic Networking Concepts-Beginners Guide](http://www.steves-internet-guide.com/networking/)
* [What is Computer Networking?](https://aws.amazon.com/what-is/computer-networking/)

---------------------------------------------------------------------------

1. Эндрю С. Таненбаум Современные операционные системы: [пер. с англ.]: Питер, 2011.

## Основы языка PHP

Главная область применения PHP – написание скриптов, работающих на стороне сервера; таким образом, PHP способен выполнять все то, что выполняет любая другая программа CGI, например, обрабатывать данные форм, генерировать динамические страницы или отсылать и принимать cookies.

PHP доступен для большинства операционных систем, включая Linux, многие модификации Unix (такие как HP-UX, Solaris и OpenBSD), Microsoft Windows, macOS, RISC OS и многие другие. Также в PHP включена поддержка большинства современных веб-серверов, таких как Apache, IIS и многих других. В принципе, подойдёт любой веб-сервер, способный использовать бинарный файл FastCGI PHP, например, lighttpd или nginx. PHP может работать в качестве модуля или функционировать в качестве процессора CGI.

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

Полезные ссылки:

* [Возможности PHP](https://www.php.net/manual/ru/intro-whatcando.php)

### Основы синтаксиса

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

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

Как в C или Perl, PHP требует окончания инструкций точкой запятой в конце каждой инструкции. Закрывающий тег блока PHP-кода автоматически применяет точку с запятой; т.е. нет необходимости ставить точку с запятой в конце последней строки блока с PHP-кодом. Закрывающий тег блока "поглотит" немедленно следующий за ним переход на новую строку, если таковой будет обнаружен.

PHP поддерживает комментарии в стиле 'C', 'C++' и оболочки Unix (стиль Perl). Однострочные комментарии идут только до конца строки или текущего блока PHP-кода, в зависимости от того, что идёт перед ними. Это означает, что HTML-код после // ... ?> или # ... ?> БУДЕТ напечатан: ?> завершает режим PHP и возвращает режим HTML, а // или # не могут повлиять на это. 'C'-комментарии заканчиваются при первой же обнаруженной последовательности */.

Полезные ссылки:

* [Основы синтаксиса](https://www.php.net/manual/ru/language.basic-syntax.php)

### Типы данных

У каждого выражения в PHP один из следующих встроенных типов в зависимости от его значения:

* null
* bool
* int
* float (floating-point number)
* string
* array
* object
* callable
* resource

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

Полезные ссылки:

* [Типы данных](https://github.com/MaksimDzhangirov/PHP-cheatsheet/blob/master/Data-types.md)

### Переменные, константы

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

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

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

Полезные ссылки:

* [Переменные](https://www.php.net/manual/ru/language.variables.php)
* [Константы](https://www.php.net/manual/ru/language.constants.php)

### Выражения, операторы

Выражения – это самые важные строительные элементы PHP. Почти всё, что вы пишете в PHP, является выражением. Самое простое и точное определение выражения — *все что угодно, имеющее значение*.

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

Операторы можно сгруппировать по количеству принимаемых ими значений. Унарные операторы принимают только одно значение, например, `!` (оператор логического отрицания) или `++` (инкремент). Бинарные операторы принимают два значения; это, например, знакомые всем арифметические операторы `+` (плюс) и `-` (минус), большинство поддерживаемых в PHP операторов входят именно в эту категорию. Ну и, наконец, есть всего один тернарный оператор, `? :`, принимающий три значения, обычно его так и называют – *тернарный оператор*.

Полезные ссылки:

* [Выражения](https://www.php.net/manual/ru/language.expressions.php)
* [Операторы](https://www.php.net/manual/ru/language.operators.php)

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

Все скрипты в PHP представляют собой набор различных выражений, которые выполняются последовательно. Выражения можно объединять в группы выражений при помощи *операторных скобок* `{` и `}`. Группы выражений используются в основном вместе с управляющими конструкциями языка PHP.

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

Конструкции бинарного (двойственного) выбора позволяют в зависимости от условия выполнить либо первое, либо второе действие. В PHP эти конструкции представлены ключевыми словами `if`, `else`, `elseif` и `endif`.

Конструкция множественного выбора представляет собой компактную форму записи длинных цепочек условий вида `if...elseif...elseif......else`. В PHP такая конструкция носит название `switch`.

Конструкции повторения (организации циклов) предназначены для многократного выполнения одних и тех же выражений. К этим конструкциям относятся `while`, `do-while`, `for` и
`foreach`.

Последняя группа конструкций – конструкции включения. Они предназначены для включения в текст скрипта каких-либо данных и кода, находящихся в другом файле. Всего существует четыре варианта: `include`, `include_once`, `require`, `require_once`.

Конструкции с приставкой `_once` отличаются от прочих тем, что гарантируют однократное включение файла в рамках всех задействованых файлов. `include_once` или `require_once` предварительно проверят предыдущие включения, и если файл уже был подключен – повторно подключать его не будут. Отличие между `include` и `require` заключено в поведении при отсутсвующем файле для подключения. Если `include` или `inclide_once` не находят указанный файл, то выдают предупреждение для пользователя. А вот `require` и `require_once` генерируют ошибку и прекращают дальнейшее выполнение скрипта.

Полезные ссылки:

* [Управляющие конструкции](https://www.php.net/manual/ru/language.control-structures.php)

### Функции

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

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

После имени функции в скобках идет перечисление параметров. Даже если параметров у функции нет, то просто идут пустые скобки. Затем в фигурных скобках идет тело функции, содержащее набор инструкций.

Полезные ссылки:

* [Функции](https://www.php.net/manual/ru/language.functions.php)

## Более сложные темы
### Классы и объекты

PHP включает полноценную объектную модель. Некоторые из её особенностей: видимость, абстрактные и ненаследуемые (`final`) классы и методы, а также магические методы, интерфейсы и клонирование.

PHP работает с объектами так же, как с ссылками или дескрипторами, это означает что каждая переменная содержит ссылку на объект, а не его копию.

Полезные ссылки:

* [Классы и объекты](https://www.php.net/manual/ru/language.oop5.php)

#### Статические методы и свойства

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

Пример статического метода и свойства.

```php

```

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

```php

```

Статические элементы имеют ряд полезных особенностей:

1. они доступны из любой точки сценария. Это означает, что можно вызывать функции, не передавая экземпляр класса от одного объекта другому или сохраняя экземпляр объекта в глобальной переменной.
2. статическое свойство доступно каждому экземпляру объекта этого класса, поэтому можно определить значения, которые должны быть доступны всем объектам данного типа.
3. позволяют не создавать экземпляр объекта ради вызова статической функции.

Полезные ссылки:

* [Ключевое слово static](https://www.php.net/manual/ru/language.oop5.static.php)

#### Абстрактные классы

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

```php
getValue() . "\n";
}
}

?>
```

Полезные ссылки:

* [Абстрактные классы](https://www.php.net/manual/ru/language.oop5.abstract.php)

#### Интерфейсы

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

Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова `interface` вместо `class`. Тела методов интерфейсов должны быть пустыми.

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

```php
vars[$name] = $var;
}

public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}

return $template;
}
}
?>
```

Все методы, определенные в интерфейсы должны быть объявлены как `public`.

Интерфейс может содержать публичные методы (простые и статические), а также константы. Интерфейс НЕ может содержать любые свойства, непубличные методы и константы, методы с реализацией.

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

Полезные ссылки:

* [Интерфейсы объектов](https://www.php.net/manual/ru/language.oop5.interfaces.php)

#### Трейты

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

**Пример использования трейта**

```php

```

##### Особенности использования трейтов
###### Использование нескольких трейтов

В класс можно включить несколько трейтов. Для этого их нужно перечислить через запятую после ключевого слова `use`.

```php
sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
```

###### Совместное использование трейтов и интерфейсов

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

###### Устранение конфликтов имен с помощью ключевого слова `insteadof`. Псевдонимы для переопределенных методов трейта

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

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

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

```php

```

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

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

```php
inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>
```

###### Определение абстрактных методов в трейтах

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

```php
getWorld();
}
abstract public function getWorld();
}

class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
?>
```

###### Изменение прав доступа к методам трейта

Используя синтаксис оператора `as` можно также настроить видимость метода в использующем трейт классе.

```php

```

###### Трейты, состоящие из трейтов

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

```php
sayHello();
$o->sayWorld();
?>
```

###### Свойства

Трейты могут также определять свойства.

```php
x;
?>
```

Полезные ссылки:

* [Трейты](https://www.php.net/manual/ru/language.oop5.traits.php)

#### Позднее статическое связывание

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

**Использование static::**

```php

```

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

```php
abstract class DomainObject
{
public static function create ()
{
return new static ();
}
class User extends DomainObject ()
{
}
class Document extends DomainObject ()
{
}
print_r(Document::create());
```

Ключевое слово `static` можно использовать не только для создания объектов. Так же, как и `self` и `parent`, его можно использовать как идентификатор для вызова статических методов даже из нестатического контекста.

```php
abstract class DomainObject
{
private $group;
public function __construct()
{
$this->group = static::getGroup();
}
public static function create(): DomainObject
{
return new static();
}
public static function getGroup(): string
{
return "default";
}
}
class User extends DomainObject
{
}
class Document extends DomainObject
{
public static function getGroup(): string
{
return "document";
}
}
class SpreadSheet extends Document
{
}

print_r(User::create());
print_r(SpreadSheet::create());
```

Полезные ссылки:

* [Позднее статическое связывание](https://www.php.net/manual/ru/language.oop5.late-static-bindings.php)

#### Магические методы

Магические методы – это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определённые действия.

Полезные ссылки:

* [Магические методы](https://www.php.net/manual/ru/language.oop5.magic.php)

#### Наследование vs Композиция vs Агрегация

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

Агрегирование (англ. object aggregation, object composition), или, как его называли ранее, делегирование, в объектно-ориентированном программировании — методика создания нового класса из уже существующих классов путём их включения. Об агрегировании также часто говорят как об «отношении принадлежности» по принципу «у машины есть корпус, колёса и двигатель».

Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.

Композиция (агрегирование по значению) — более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.

Полезные ссылки:

* [Наследование](https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))
* [Агрегирование](https://ru.wikipedia.org/wiki/%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))
* [Наследование vs Композиция vs Агрегация](https://github.com/MaksimDzhangirov/PHP-cheatsheet/blob/master/inheritanceVsCompositionVsAggregation.md)

### Пространства имён

Пространства имён в широком смысле – это один из способов инкапсуляции элементов.

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

1. Конфликт имён между вашим кодом и внутренними классами/функциями/константами PHP или сторонними.
2. Возможность создавать псевдонимы (или сокращения) для Ну_Очень_Длинных_Имён, чтобы облегчить первую проблему и улучшить читаемость исходного кода.

Полезные ссылки:

* [Пространства имён](https://www.php.net/manual/ru/language.namespaces.php)

### Ошибки и исключения

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

Каждая ошибка, генерируемая PHP, обязательно содержит информацию о своём типе. [В этом списке](https://www.php.net/manual/ru/errorfunc.constants.php) перечислены все типы ошибок, а также описания их поведений и провоцирующие их причины.

В PHP реализована модель исключений, аналогичная тем, что используются в других языках программирования. Исключение в PHP может быть выброшено (`throw`) и поймано (`catch`). Код может быть заключён в блок `try`, чтобы облегчить обработку потенциальных исключений. У каждого блока `try` должен быть как минимум один соответствующий блок `catch` или `finally`.

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

Полезные ссылки:

* [Ошибки](https://www.php.net/manual/ru/language.errors.php)
* [Исключения](https://www.php.net/manual/ru/language.exceptions.php)

### Генераторы

Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов или сложностей, связанных с реализацией класса, реализующего интерфейс `Iterator`.

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

Полезные ссылки:

* [Генераторы](https://www.php.net/manual/ru/language.generators.php)

### SPL – Стандартная библиотека PHP

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

SPL предоставляет ряд стандартных структур данных, итераторов для оббегания объектов, интерфейсов, стандартных исключений, некоторое количество классов для работы с файлами и предоставляет ряд функций, например `spl_autoload_register()`.

Полезные ссылки:

* [SPL – Стандартная библиотека PHP](https://www.php.net/manual/ru/book.spl.php)

#### Структуры данных

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

Полезные ссылки:

* [Структуры данных](https://www.php.net/manual/ru/spl.datastructures.php)
* [Двусвязные списки](https://www.php.net/manual/ru/class.spldoublylinkedlist.php)
* [Стек](https://www.php.net/manual/ru/class.splstack.php)
* [Очередь](https://www.php.net/manual/ru/class.splqueue.php)
* [Куча](https://www.php.net/manual/ru/class.splheap.php)
* [Очередь с приоритетом](https://www.php.net/manual/ru/class.splpriorityqueue.php)
* [Массив фиксированной длины](https://www.php.net/manual/ru/class.splfixedarray.php)
* [Отображение объектов в данные](https://www.php.net/manual/ru/class.splobjectstorage.php)

## Composer

Composer – это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении. Composer разработали и продолжают поддерживать два программиста Nils Adermann и Jordi Boggiano. Они начали разрабатывать Composer в апреле 2011, а первый релиз состоялся 1 марта 2012. Идея создания пакетных менеджеров уровня приложений не нова и его авторы вдохновлялись уже существовавшими на тот момент времени `npm` для `Node.js` и `bundler` для `Ruby`.

Composer работает через интерфейс командной строки и устанавливает зависимости (например библиотеки) для приложения. Он также позволяет пользователям устанавливать PHP-приложения, которые доступны на [packagist.org](https://packagist.org/), который является его основным репозиторием, где содержатся все доступные пакеты.

### require, install, update

#### require

Команда `require` добавляет новые пакеты в файл `composer.json` из текущего каталога. Если файла не существует, он будет создан на лету.
После добавления/изменения зависимостей, они будут установлены или обновлены.
Если вы не хотите выбирать зависимости в интерактивном режиме, вы можете передать их команде.

```shell
php composer.phar require "vendor/package:2.*" vendor/package2:dev-master
```

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

#### install

Команда `install` считывает файл `composer.json` из текущего каталога, разрешает зависимости и устанавливает их в `vendor`.

```shell
php composer.phar install
```

Если в текущем каталоге есть файл `composer.lock`, он будет использовать конкретные версии оттуда, а не разрешать их. Это гарантирует, что все, кто использует библиотеку, получат одинаковые версии зависимостей.

Если файла `composer.lock` нет, Composer создаст его после разрешения зависимостей.

#### update

Чтобы получить последние версии зависимостей и обновить файл `composer.lock`, вы должны использовать команду `update`. Эта команда также называется `upgrade`, поскольку она делает то же самое, что и `upgrade`, если сравнивать с `apt-get` или подобными менеджерами пакетов.

```shell
php composer.phar update
```

Это разрешит все зависимости проекта и запишет конкретные версии в `composer.lock`.

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

```shell
php composer.phar update vendor/package vendor/package2
```

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

```shell
php composer.phar update "vendor/*"
```

Если вы хотите понизить версию пакета до определенной версии, не изменяя ваш composer.json, вы можете использовать `--with` и указать ограничение версии:

```shell
php composer.phar update --with vendor/package:2.0.1
```

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

```shell
php composer.phar update vendor/package:2.0.1 vendor/package2:3.0.*
```

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

Полезные ссылки:

* [require](https://getcomposer.org/doc/03-cli.md#require-r)
* [install](https://getcomposer.org/doc/03-cli.md#install-i)
* [update](https://getcomposer.org/doc/03-cli.md#update-u-upgrade)

### Система управления пакетами

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

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

Полезные ссылки:

* [Система управления пакетами](https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0%D0%BC%D0%B8)

### Packagist

Packagist – это хостинг PHP-пакетов. Это дефолтный хостинг Composer. Каждый месяц Composer используется для загрузки более 2 миллиардов пакетов. Packagist представляет собой один из крупнейших хостинговых сервисов в экосистеме PHP.

Полезные ссылки:

* [Packagist](https://packagist.org/)

### Автозагрузка

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

Ранее написание автозагрузчика классов осуществлялось с помощью PHP функции `spl_autoload_register`, и каждый сам организовывал структуру приложения в соответствии с придуманным им правилами. Для того, чтобы все разработчики придерживались предопределенных правил и не придумывали свои, сообщество PHP разработчиков написали рекомендации (стандарты) PSR-0 и PSR-4, которые позволят всем PHP программистам организовывать структуру таким образом, чтобы их приложение было проще понимать другим. В настоящий момент следует организовывать автозагрузку в соответствии с PSR-4, поскольку это более актуальный и рекомендуемый на данный момент способ организации структуры.

Полезные ссылки:

* [Автоматическая загрузка классов](https://www.php.net/manual/ru/language.oop5.autoload.php)
* [Автозагрузка классов с Composer в PHP](https://webformyself.com/avtozagruzka-klassov-s-composer-v-php/)

## Работа с базами данных в PHP

Базы данных широко применяются для структурирования и хранения информации. Таким образом, на практике базы данных применяют:

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

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

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

* выполнять запросы и получать результаты;
* обрабатывать ошибки;
* читать и записывать данные;

При подключении к MySQL соответствующий сценарий исполняет запрос и показывает результат запроса. Но самое главное заключается в том, что для работы с СУБД MySQL разработчику не придется ничего специально устанавливать, так как все нужное будет сразу доступно и включено в стандартный пакет PHP.

### PDO

Модуль `PHP Data Objects` (PDO) определяет простой и согласованный интерфейс для доступа к базам данных в PHP. Каждый драйвер базы данных, в котором реализован этот интерфейс, может представить специфичную для базы данных функциональность в виде стандартных функций модуля. Но надо заметить, что сам по себе модуль PDO не позволяет манипулировать доступом к базе данных. Чтобы воспользоваться возможностями PDO, необходимо использовать соответствующий конкретной базе данных PDO драйвер.

PDO обеспечивает абстракцию *доступу к данным*, это значит, что вне зависимости от того, какая конкретная база данных используется, вы можете пользоваться одними и теми же функциями для выполнения запросов и выборки данных. PDO *не* абстрагирует саму *базу данных*, этот модуль не переписывает SQL-запросы и не эмулирует отсутствующий в СУБД функционал. Если нужно именно это, необходимо воспользоваться полноценной абстракцией базы данных.

Модуль PDO внедрён в PHP.

Полезные ссылки:

* [PDO](https://www.php.net/manual/ru/book.pdo.php)

### ORM

ORM (Object-Relation Mapping, объектно-реляционное отображение) – общее название для библиотек, позволяющих автоматически связать базу данных с кодом. Они стараются скрыть существование базы данных настолько, насколько это возможно. Взамен, программисту дают возможность оперировать данными в базе через специальный интерфейс. Вместо построения SQL-запросов, программист вызывает простые методы, а всю остальную работу берёт на себя ORM.

Полезные ссылки:

* [ORM](https://ru.wikipedia.org/wiki/ORM)
* [Список ORM-библиотек](https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_ORM-%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA#PHP)

#### Doctrine

Doctrine – ORM для PHP 7.1+, который базируется на слое абстракции доступа к БД (DBAL). Одной из ключевых возможностей Doctrine является запись запросов к БД на собственном объектно-ориентированном диалекте SQL, называемом DQL (Doctrine Query Language) и базирующемся на идеях HQL (Hibernate Query Language).

Полезные ссылки:

* [Doctrine](https://www.doctrine-project.org/)
* [Doctrine](https://ru.wikipedia.org/wiki/Doctrine)

## Отладка

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

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

Существуют две взаимодополняющие технологии отладки:

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

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

### xDebug

xDebug – средство профилирования и отладки PHP-скриптов. XDebug поставляется как расширение для PHP и работает по протоколу DBGp.

Полезные ссылки:

* [xDebug](https://xdebug.org/)
* [Xdebug](https://ru.wikipedia.org/wiki/Xdebug)

### Zend Debugger

PHP расширение, которое необходимо установить на ваш веб-сервер для оптимальной удаленной отладки и профилирования с помощью Zend Studio.

Полезные ссылки:

* [Zend Debugger](https://www.zend.com/downloads/zend-studio-web-debugger)

## Качество кода

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

* Функциональный
* Последовательный
* Его легко понять
* Удовлетворяет потребностям клиентов
* Тестируемый
* Поддерживает многоразовое использование
* В нём отсутствуют ошибки и недочеты
* Безопасный
* Хорошо документированный

### PSR-12

Cпецификация PSR-12 расширяет и заменяет руководство по стилю кодирования PSR-2 и требует соблюдения PSR-1, основного стандарта кодирования.

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

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

Полезные ссылки:

* [PSR-12](https://www.php-fig.org/psr/psr-12/)

### CodeSniffer

PHP CodeSniffer состоит из двух скриптов; главный `phpcs` размечает PHP, JavaScript, CSS файлы для обнаружения нарушений определенных стандартов кода. Второй скрипт `phpcbf` автоматически исправляет ошибки в коде. CodeSniffer — это полезный инструмент разработчика, гарантирующий чистоту и последовательность кода.

Полезные ссылки:

* [CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer)

### Psalm

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

Полезные ссылки:

* [Psalm](https://psalm.dev/)

### Phan

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

Полезные ссылки:

* [Phan](https://github.com/phan/phan)

### PHPStan

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

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

Полезные ссылки:

* [PHPStan](https://phpstan.org/)

## Кэширование

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

### PSR-6 и PSR-16

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

Полезные ссылки:

* [PSR-6](https://www.php-fig.org/psr/psr-6/)
* [PSR-16](https://www.php-fig.org/psr/psr-16/)

### APCu

APCu – это хранилище «ключ-значение» в памяти для PHP. Ключи являются строками (string), а значения могут быть любыми переменными PHP. APCu поддерживает только кеширование переменных в пользовательском пространстве.

Полезные ссылки:

* [APCu](https://www.php.net/manual/ru/book.apcu.php)

### Файловая система

Когда нет возможности установить APCu или Redis, то кеш можно хранить в файловой системе. Считать информацию из файла и выполнить десериализацию часто бывает намного быстрее, чем выполнить громоздкий SELECT запрос с несколькими джойнами.

Полезные ссылки:

* [Filesystem Cache Adapter](https://symfony.com/doc/current/components/cache/adapters/filesystem_adapter.html)

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

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

### PHPUnit

PHPUnit – фреймворк для unit тестирования при разработке ПО на PHP. Является представителем семейства фреймворков XUnit на основе пакета SUnit, созданного Кентом Беком. PHPUnit разработан Себастьяном Бергманом.

Основная идея PHPUnit – чем раньше вы обнаружите ошибки в коде, тем быстрее вы сможете их исправить. Как и все фреймворки для unit тестирования PHPUnit использует assertions (утверждения) для проверки, что конкретный компонент ведёт себя как и ожидалось.

Полезные ссылки:

* [PHPUnit](https://phpunit.de/)

### Codeception

Codeception — это популярный фреймворк для тестирования веб-приложений. Он написан поверх PHPUnit и позволяет более элегантно писать тесты используя методологию BDD. BDD (behaviour-driven development) — это разработка, основанная на описании поведения, что облегчает написание и чтение кода тестов. Поддерживает приемочные, функциональные и unit тесты.

Полезные ссылки:

* [Codeception](https://codeception.com/)

### Behat

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

Полезные ссылки:

* [Behat](https://behat.org/)

## Веб-фреймворки

Веб-фреймворк – [фреймворк](https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA), предназначенный для создания динамических веб-сайтов, сетевых приложений, сервисов или ресурсов. Он упрощает разработку и избавляет от необходимост�