PHP поддерживает 10 типов данных
- Целые числа
integer
: Целые числа без десятичных знаков, например 42, -10, 0. - Числа с плавающей точкой
float
: Числа с десятичными знаками, например 3.14, -2.5, 0.0. - Строки
string
: Последовательности символов, заключенные в одинарные или двойные кавычки, например 'Hello', "World". - Булев тип
boolean
: Логическое значение true или false. - Массивы
array
: Упорядоченные коллекции элементов, каждый из которых имеет свой индекс или ключ. - Объекты
object
: Экземпляры классов, содержащие свойства и методы. - Ресурсы
resource
: Ссылки на внешние ресурсы, такие как файлы или соединения с базами данных. Null
: Особое значение null, которое означает отсутствие значения.Callback/Callable
: Замыкания на функции.- Псевдотипы
pseudo-types
: Некоторые псевдотипы, такие какmixed, number, void, iterable, never
которые представляют собой специальные категории типов данных или ограничения.
Магические методы в PHP это специальные методы которые начинаются с двойного подчёркивания например __construct()
.
Они предоставляют специальное поведение и функциональность в определенных контекстах внутри классов.
Используются для выполнения определенных действий при определенных событиях или операциях
Список магических методов
__construct()
Конструктор класса, вызывается при создании нового объекта.__destruct()
Деструктор класса, вызывается при удалении объекта.__get()
Вызывается при чтении недоступного или несуществующего свойства объекта.__set()
Вызывается при записи значения в недоступное или несуществующее свойство объекта.__call()
Вызывается при вызове недоступного или несуществующего метода объекта.__toString()
Вызывается при попытке преобразования объекта в строку.__isset()
Вызывается при проверке наличия недоступного или несуществующего свойства объекта с помощью isset().__unset()
Вызывается при удалении недоступного или несуществующего свойства объекта с помощью unset().
PHP сессии это механизм для хранения информации о состоянии пользователя на сервере между последовательными запросами.
Механизм работы:
- Когда пользователь открывает веб-страницу, PHP генерирует уникальный идентификатор сессии, который обычно представлен в виде cookie с именем "PHPSESSID".
- Этот идентификатор используется для связи данных сессии на сервере с конкретным пользователем.
- По умолчанию данные сессии в PHP хранятся на сервере в виде временных файлов в специальной директории, указанной в настройках PHP (обычно в /tmp или другом системном каталоге).
- Когда пользователь отправляет запрос на сервер, PHP использует идентификатор сессии из cookie или переданного параметра запроса для определения соответствующего файла сессии.
- Затем данные сессии загружаются в специальный массив $_SESSION, который содержит сохраненные переменные и значения, связанные с пользователем.
- После обработки запроса и завершения выполнения скрипта, данные сессии автоматически сохраняются обратно в файл на сервере.
- Каждый раз, когда пользователь делает запрос на сервер, PHP автоматически связывает данные сессии с соответствующим идентификатором сессии, обновляет их и возвращает обновленные данные на клиентскую сторону.
Сессии в PHP позволяют сохранять информацию о состоянии пользователя между запросами, что полезно для реализации авторизации, хранения корзины покупок, персонализации и других сценариев.
Cookies (куки) - это небольшие фрагменты данных, которые веб-сервер отправляет и хранит на компьютере пользователя через веб-браузер.
Cookies используются для сохранения информации о состоянии и активности пользователя на веб-сайте. Могут выставляться как на бэкенде, так и на фронтенде.
- setcookie - преобразует данные перед отправкой
- setrawcookie - отправляет данные в сыром виде
- header('Set-Cookie: name=value')
Установка обоих параметров в setcookie: secure и httponly обеспечивает их защитой от чтения на стороне JS
Основное отличие между LocalStorage и Cookies заключается в способе хранения данных, автоматической отправке, сроке жизни, доступности, трафике который генерируется при отправке cookies
PHP 8: Новый JIT-компилятор, Сильная типизация, Nullsafe оператор, Union Types, Named Arguments, Attributes
- Новый JIT-компилятор: JIT-компилятор преобразует некоторые части кода PHP в машинный код, что ускоряет его выполнение.
- Сильная типизация: PHP 8 внедряет более строгую типизацию и вводит поддержку объявления строгих типов для аргументов функций и возвращаемых значений.
- Nullsafe оператор: В PHP 8 добавлен оператор "?->", который обеспечивает безопасный доступ к свойствам и методам объектов, даже если промежуточные значения равны null.
- Union Types: PHP 8 вводит поддержку объединенных типов, которые позволяют указывать несколько типов для переменной, параметра функции или возвращаемого значения. Например, можно указать тип int|string, что означает, что переменная может быть либо целым числом, либо строкой.
- Named Arguments: В PHP 8 появилась возможность передавать аргументы функций по имени, что упрощает чтение и понимание кода, особенно при работе с функциями с большим количеством аргументов.
- Attributes: PHP 8 представляет атрибуты (Attributes), которые позволяют добавлять метаданные к классам, методам, свойствам и другим элементам кода. Атрибуты используются для аннотирования и декларативного описания кода.
- Множество других улучшений: PHP 8 также включает множество других улучшений, таких как улучшенная поддержка ошибок и исключений, новые функции стандартной библиотеки, улучшения встроенных функций и многое другое.
PHP 7: Улучшенная производительность, Скалярные типы и строгая типизация, Оператор объединения объединяющий null, Строгая обработка ошибок, Оператор spaceship, Декларативные типы возвращаемых значений
- Улучшенная производительность: новый движок Zend Engine 3.0, который значительно улучшает производительность выполнения кода.
- Скалярные типы и строгая типизация: PHP 7 вводит возможность объявления скалярных типов (int, float, string, bool) для аргументов функций и возвращаемых значений. Это помогает улучшить надежность кода и облегчает обнаружение ошибок.
- Оператор объединения объединяющий null: В PHP 7 добавлен оператор объединения объединяющий null (??), который позволяет указывать значение по умолчанию, если переменная равна null. Это помогает упростить и сократить код при работе с переменными, которые могут быть null.
- Строгая обработка ошибок: PHP 7 включает более строгую обработку ошибок и выбрасывание исключений при выполнении операций, которые ранее приводили к неявным предупреждениям или непредсказуемым результатам. Это помогает улучшить качество кода и упростить отладку.
- Оператор spaceship: В PHP 7 добавлен оператор spaceship (<=>), который позволяет сравнивать два значения и возвращать отрицательное число, ноль или положительное число в зависимости от их отношения. Это упрощает сортировку и сравнение значений.
- Декларативные типы возвращаемых значений: PHP 7 вводит возможность указывать типы возвращаемых значений для функций и методов. Это помогает улучшить документирование кода и обеспечить соответствие ожидаемых типов.
- Синтаксические улучшения: PHP 7 включает несколько синтаксических улучшений, таких как использование define() для констант массивов, сокращенное синтаксиса для объявления массивов и другие мелкие улучшения, которые упрощают и улучшают читаемость кода.
Генераторы в PHP - это специальный тип функций
которые позволяют создавать итерируемые объекты для обработки больших наборов данных с низким потреблением памяти. Они предоставляют удобный способ генерации значений "на лету" без необходимости хранения всех значений в памяти одновременно.Генераторы в PHP используют ключевое слово yield для возврата значения из функции вместо ключевого слова return. Когда в функции встречается оператор yield, функция приостанавливает свое выполнение и возвращает значение. При следующем вызове генератор продолжает свою работу с того места, где остановился.
Генераторы также могут использоваться для ленивой загрузки данных из базы данных или файлов, итерации по рекурсивным структурам данных и в других ситуациях, где требуется обработка данных порциями.
Сериализация в PHP - это процесс преобразования объектов, массивов или других структур данных в формат, который может быть сохранен или передан через сеть, а затем восстановлен обратно в исходный вид.
Множественного наследование нет, но его можно реализовать с помощью: интерфейсов, трейтов, композиции, паттерны, __call
Проблема множественного наследования в том что название методов могут совпадать у родительских классов
Абстрактный класс представляет собой класс, с определённым состоянием, который не может быть инстанциирован напрямую и связывает между собой другие классы имеющий интерфейс для реализации в производных классах.
Указывает на замещение (это принцип подстановки Барбары Лисков)
Он может содержать как абстрактные методы, так и конкретные методы, наследовать можно только один класс.
Если нужно предоставить базовый функционал и реализацию методов, а также иметь возможность наследования, то используйте абстрактный класс.
Интерфейс описывает только поведение, без состояния и представляет собой публичный набор контрактов (определённый тип данных), который класс должен реализовать.
Он не содержит конкретной реализации методов, а только их сигнатуры, может реализовывать на классе несколько интерфейсов, не содержит реализации методов.Если необходимо только определить контракт и гарантировать реализацию методов в классах, то используйте интерфейс.
Трейты (traits) - это механизм в PHP, который позволяет повторно использовать код в классах.
Достоинства
- Повторное использование кода
- Горизонтальное расширение (получение функциональности из разных источников)
Недостатки
- Зависимость от трейтов (при изменении в одном месте может привести к непредсказуемым результам)
- Возможные конфликты имен
- Сложность отслеживания зависимостей
Класс - это конструкция языка для описания свойств, структуры и действий объектов. Класс является абстракцией и не имеет конкретных значений или состояния.
Объект - это экземпляр класса. Когда создается объект, он занимает физическую память и получает состояние, определенное в классе.
SplDoublyLinkedList, SplStack, SplQueue, SplHeap
MD5, SHA-256, Argon2, bcrypt
Сортировка слиянием (n*logn), Пузырьком (n^2), Быстрая сортировка(n^2)
Итераторы облегчают перебор элементов структуры данных, скрывая сложности взаимодействия с самой структурой данных. Они предоставляют единый интерфейс для доступа к элементам, независимо от внутреннего представления данных. Благодаря этому, код становится более читабельным и гибким, а также позволяет эффективно использовать ресурсы памяти при работе с большими наборами данных.
strlen O(1) - получает длину из структуры zval
mb_strlen O(n) - зависит от кодировки
Многопоточность относится к выполнению нескольких потоков (threads) внутри одного процесса. Потоки имеют свои собственные стеки вызовов и разделяют общую память процесса.
Асинхронность относится к модели выполнения, в которой одна задача не блокирует выполнение других задач. В асинхронном программировании используются события, обратные вызовы (callbacks) или промисы (promises) для управления выполнением задач
Это два различных механизма синхронизации, используемые для контроля доступа к общим ресурсам в многопоточной или многопроцессорной среде.
Cемафор - контролирует доступ к ресурсу посредством счетчика и позволяет ограниченному количеству потоков или процессов одновременно получать доступ
Мьютекс - обеспечивает эксклюзивный доступ для одного потока или процесса за раз.
Этот формат использует в основном 8-битные байты для представления символов. Определение кодировки происходит по символу BOM в начале документа или анализу последовательности байтов.
Процесс кодирования в UTF-8 выглядит следующим образом:
- Каждый символ переводиться в свой уникальный код Юникода
- Каждый символ Юникода представляется в виде кодовой точки U+, которая является шестнадцатеричным значением его уникального кода Юникода
- Каждая кодовая точка преобразуется в байтовое представление
Константный — O(1)
Порядок роста O(1) означает, что вычислительная сложность алгоритма не зависит от размера входных данных. Следует помнить, однако, что единица в формуле не значит, что алгоритм выполняется за одну операцию или требует очень мало времени.Линейный — O(n)
Порядок роста O(n) означает, что сложность алгоритма линейно растет с увеличением входного массива. Такие алгоритмы легко узнать по наличию цикла по каждому элементу входного массива.Логарифмический – O(n·log n)
Порядок роста O(n·log n) означает, что время выполнения алгоритма растет логарифмически с увеличением размера входного массива. Большинство алгоритмов, работающих по принципу «деления пополам», имеют логарифмическую сложность.Квадратичный — O(n^2)
Время работы алгоритма с порядком роста O(n^2) зависит от квадрата размера входного массива. Проблема в том, что они плохо масштабируются.Нативная поддержка
Поддерживаются непосредственно интерпретатором не требуют использования сторонних фреймворков или библиотек.Более гибкий синтаксис
Можно определять свои собственные классы атрибутов с определенными методами и свойствами, что дает больше возможностей для метапрограммирования и изменения поведения кода.Лучшая интеграция с инструментами разработки
Атрибуты легко читаются и обрабатываются инструментами разработки и анализа кода.Семантическая информация
Позволяют добавлять семантическую информацию к коду, что может быть полезно для документирования и понимания его назначения и использования. Например, вы можете добавить атрибуты, указывающие на типы аргументов метода, возможные исключения или другие сведения, которые помогут разработчикам понять, как использовать ваш код.Широкая поддержка в экосистеме PHP
Это означает, что вы можете использовать атрибуты в своих проектах и быть уверенными в их совместимости и поддержке в различных контекстах.Хэширование: Одностороннее преобразование данных для создания фиксированной длины хэш-значения.
Кодирование: Преобразование данных в другую форму без цели обеспечения безопасности для целостности и передачи данных.
Шифрование: Преобразование данных с использованием ключа для обеспечения конфиденциальности.
FPM - интерфейс, через который веб-сервер взаимодействует с PHP
Эта функциональность включает:
- Продвинутое управление процессами с корректной (graceful) процедурой остановки и запуска;
- Пулы, которые умеют запускать воркеры с разными uid, gid, chroot и окружением за счёт прослушивания разных портов и работы с разными файлами php.ini (замещение safe_mode);
- Настраиваемое ведение журнала потоков вывода (stdout) и ошибок (stderr);
- Аварийный перезапуск в случае внезапного разрушения opcode-кеша;
- Поддержка ускоренной загрузки (accelerated upload);
- slowlog — логирование необычно медленных скриптов; не только имён, но и PHP-трассировки, которое даёт команда ptrace и другие подобные функции чтения исполняемых данных (execute_data) удалённых процессов;
- fastcgi_finish_request() — специальная функция для завершения запроса и сброса всех буферов данных, причём процесс сможет продолжать выполнение других длительных действий (конвертирование видео, обработка статистики и т. п.);
- Динамическое, по требованию или статическое порождение дочерних процессов;
- Базовая и расширенная информация о состоянии (аналогично модулю mod_status веб-сервера Apache) с поддержкой разных форматов наподобие json, xml и openmetrics;
- Файл конфигурации на основе файла php.ini.
Это ситуация, когда два или более потока (или процесса) пытаются одновременно получить доступ к общему ресурсу, и результат выполнения программы зависит от порядка их выполнения. Это может привести к непредсказуемым результатам или ошибкам в работе программы.
-
Использование блокировок (Locks): Механизмы блокировок позволяют потокам или процессам получать эксклюзивный доступ к общим ресурсам. Когда один поток захватывает блокировку, другие потоки должны ждать, пока она не будет освобождена. Это гарантирует, что только один поток может изменять общий ресурс в определенный момент времени.
-
Использование пессимистический контроль в SQL: C помощью оператора «SELECT ... FOR UPDATE. Чтобы снять блокировку, пользователь может подтвердить или отменить транзакцию: COMMIT; ROLLBACK
-
Оптимистичный контроль параллелизма Добавить столбец для хранения «номера версии», который увеличивается при каждом обновлении. UPDATE Room SET available = FALSE, version = version + 1 WHERE id = 123 AND version = 1;
-
Использование паттерна Unit of Work
-
Использование идемпотентности запросов
Для улучшения кодовой базы
- Надо ли это вообще, в правильном ли месте код
- Соответствие условию задачи
- Код соответствует стайл гайдам.
- Хорошо ли спроектирован код
- Функциональность хорошо сделана с точки зрения пользователей этого кода, кем бы они ни были.
- Внешний вид (если есть) должен быть хорошим
- Учтены все нюансы параллельного программирования (если есть).
- Код не переусложнен SOLID, DRY, KISS, YAGNI, BDUF, APO
- Производительность
- Безопасность: Проверка на уязвимости, валидация данных
- Правильно ли работают выборки
- У кода есть тесты
- Тесты хорошо спроектированы - Учитываются ли все граничные случаи
- Наименования (для всего) выбраны хорошо
- Комментарии к коду понятны и необходимы. Они должны объяснять, почему так сделано, а не как это сделано.
- Добавлена документация.
- Помечать мелочи и предирки nit
Обсудили в коментах -> Обсудили лично -> Обсудили в команде -> Двигаемся дальше