PHP strict_types

По умолчанию PHP пытается приводить значения несоответствующих скалярных типов(int, float, bool, string), если это возможно. Например если функция ожидает строку, а ей передается число - php приведет число к строке.

Для отдельных файлов можно включить режим строгой типизации (директивой declare(strict_types=1)), при включенной директиве в функцию можно будет передать аргументы только тех типов, которые объявлены.

В противном случае будет создано исключение TypeError.

Есть одно исключение: int можно передать в функцию, которая ожидает float.

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

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

Строгая типизация применима только к скалярным типам и работает только в PHP 7.0.0 и выше. Равно как и сами объявления скалярных типов добавлены в этой версии.

Итераторы / Генераторы

Итераторы:

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

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

Генераторы:

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

Отличия:

Генераторы просты и удобны, меньше надо писать кода, но:

  • они являются однонаправленными итераторами
  • их нельзя перемотать на начало после старта итерации
  • нельзя использовать дважды, надо пересоздавать генератор

Сессии

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

ООП

Наследование:

Механизм позволяющий наследовать свойства и методы одними классами от другого/других классов, расширяя/дополняя реализации этих методов. Например:

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

Полиморфизм:

Возможность одинаковым образом взаимодействовать с объектами реализующими общий интерфейс. Например:

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

Инкапсуляция:

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

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

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

В PHP начиная с версии 5.3 появилось позднее статическое связывание.

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

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

Слово static было добавлено, чтобы реализовать новый функционал, а для обратной совместимости self работает также как и в предыдущих версиях PHP.

Внутренне, основное отличие (и, собственно, причина почему связывание назвали поздним) между этими двумя способами доступа в том, что PHP определят значение для self::NAME во время «компиляции» (когда символы PHP преобразуются в машинный код, который будет обрабатываться движком Zend), а для static::NAME значение будет определено в момент запуска (в тот момент, когда машинный код будет выполнятся в движке Zend)

Минусы публичных статических методов в PHP

  • В этих методах нет $this, и его использование в статическом методе вылезет только при выполнении - что приведет к неожиданным ошибкам.
  • Позднее статическое связывание
  • Один метод на все экземпляры класса - использовать такой инструмент нужно очень внимательно и осторожно

SOLID

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

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

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

Принцип подстановки Барбары Лисков - необходимо чтобы классы наследники могли использоваться вместо классов от которых они наследуются. Если в коде есть проверка на принадлежность объекта классу - принцип нарушен.

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

Принцип инверсии зависимостей - объектом зависимости должна быть абстракция. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.

Минусы SOLID

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

SQL JOIN

INNER JOIN

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

LEFT [OUTER] JOIN

Порядок таблиц важен.
В результат попадает INNER JOIN таблиц.
Затем для всех строк левой(изначальной, не которую подключаем) таблицы, которые не вошли в INNER JOIN, столбцы правой таблицы заполняются значением NULL.

RIGHT [OUTER] JOIN

Порядок таблиц важен.
В результат попадает INNER JOIN таблиц.
Затем для всех строк правой(которую подключаем, не изначальной) таблицы, которые не вошли в INNER JOIN, столбцы левой таблицы заполняются значением NULL (в противоположность LEFT JOIN).

FULL [OUTER] JOIN

Порядок таблиц неважен.
В результат попадает INNER JOIN.
Затем для всех строк первой таблицы, которые не вошли в INNER JOIN столбцы второй заполняются значением NULL.
Затем для всех строк второй таблицы столбцы, которые не вошли в INNER JOIN столбцы первой заполняются значением NULL.

CROSS JOIN

Порядок таблиц неважен.
В результат попадет перемножение двух таблиц - каждая строка одной таблицы соединяется с каждой строкой второй таблицы. То есть на выходе получим все возможные сочетания пар строк этих таблиц.
Если указать предикат, то результат будет эквивалентен INNER JOIN с этим предикатом

SQL NULL

В SQL NULL не равен какому либо другому значению, и сравнение NULL = NULL не является истиной, но неизвестено. Поэтому для проверки значения на NULL есть другой оператор - VALUE IS [NOT] NULL.

Индексы в MySQL

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

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

Группировка по нескольким колонкам в SQL

Просто перечисляем колонки в GROUP BY.
Если перечисленные колонки будут иметь одинаковые значения - они будут объединены в одну. Порядок колонок не важен.

Свойства транзакций ACID

Atomicity / Атомарность - никакая транзакция не может быть выполнена частично. Будут выполнены либо все операции транзакции, либо ни одной.
Consistency / Консистентность - успешная транзакция гарантирует фиксацию только допустимых результатов.
Isolation / Изолированность - во время выполнения транзакции, параллельные транзакции не должны влиять на её результат.
Durability / Стойкость - независимо от проблем на нижних уровнях (обесточивание сервера/сбои в работе оборудования) изменения, сделанные успешно выполненной транзакцией, должны остаться сохраненными после возвращения системы в работу.