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 / Стойкость - независимо от проблем на нижних уровнях (обесточивание сервера/сбои в работе оборудования) изменения, сделанные успешно выполненной транзакцией, должны остаться сохраненными после возвращения системы в работу.