Skip to content

Latest commit

 

History

History
383 lines (275 loc) · 33.6 KB

GENERAL.MD

File metadata and controls

383 lines (275 loc) · 33.6 KB

1. Какие типы данных вы знаете в PHP и сколько их?

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 которые представляют собой специальные категории типов данных или ограничения.

2. Что такое магические методы в PHP, использовали ли их и для чего?

Магические методы в PHP это специальные методы которые начинаются с двойного подчёркивания например __construct(). Они предоставляют специальное поведение и функциональность в определенных контекстах внутри классов. Используются для выполнения определенных действий при определенных событиях или операциях

Список магических методов
  • __construct() Конструктор класса, вызывается при создании нового объекта.
  • __destruct() Деструктор класса, вызывается при удалении объекта.
  • __get() Вызывается при чтении недоступного или несуществующего свойства объекта.
  • __set() Вызывается при записи значения в недоступное или несуществующее свойство объекта.
  • __call() Вызывается при вызове недоступного или несуществующего метода объекта.
  • __toString() Вызывается при попытке преобразования объекта в строку.
  • __isset() Вызывается при проверке наличия недоступного или несуществующего свойства объекта с помощью isset().
  • __unset() Вызывается при удалении недоступного или несуществующего свойства объекта с помощью unset().

3. Что такое сессия в PHP, где она хранится по умолчанию и как этот механизм работает?

PHP сессии это механизм для хранения информации о состоянии пользователя на сервере между последовательными запросами.

Механизм работы:

  1. Когда пользователь открывает веб-страницу, PHP генерирует уникальный идентификатор сессии, который обычно представлен в виде cookie с именем "PHPSESSID".
  2. Этот идентификатор используется для связи данных сессии на сервере с конкретным пользователем.
  3. По умолчанию данные сессии в PHP хранятся на сервере в виде временных файлов в специальной директории, указанной в настройках PHP (обычно в /tmp или другом системном каталоге).
  4. Когда пользователь отправляет запрос на сервер, PHP использует идентификатор сессии из cookie или переданного параметра запроса для определения соответствующего файла сессии.
  5. Затем данные сессии загружаются в специальный массив $_SESSION, который содержит сохраненные переменные и значения, связанные с пользователем.
  6. После обработки запроса и завершения выполнения скрипта, данные сессии автоматически сохраняются обратно в файл на сервере.
  7. Каждый раз, когда пользователь делает запрос на сервер, PHP автоматически связывает данные сессии с соответствующим идентификатором сессии, обновляет их и возвращает обновленные данные на клиентскую сторону.

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

4. Что такое cookies?

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

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

5. Как они выставляются на бэке?

  1. setcookie - преобразует данные перед отправкой
  2. setrawcookie - отправляет данные в сыром виде
  3. header('Set-Cookie: name=value')

6. Можно ли их сделать защищёнными чтоб их не могли прочитать?

Установка обоих параметров в setcookie: secure и httponly обеспечивает их защитой от чтения на стороне JS

7. Что такое localstorage чем отличается от cookies?

Основное отличие между LocalStorage и Cookies заключается в способе хранения данных, автоматической отправке, сроке жизни, доступности, трафике который генерируется при отправке cookies

8. Что нового в PHP 7, PHP 8

PHP 8: Новый JIT-компилятор, Сильная типизация, Nullsafe оператор, Union Types, Named Arguments, Attributes
  1. Новый JIT-компилятор: JIT-компилятор преобразует некоторые части кода PHP в машинный код, что ускоряет его выполнение.
  2. Сильная типизация: PHP 8 внедряет более строгую типизацию и вводит поддержку объявления строгих типов для аргументов функций и возвращаемых значений.
  3. Nullsafe оператор: В PHP 8 добавлен оператор "?->", который обеспечивает безопасный доступ к свойствам и методам объектов, даже если промежуточные значения равны null.
  4. Union Types: PHP 8 вводит поддержку объединенных типов, которые позволяют указывать несколько типов для переменной, параметра функции или возвращаемого значения. Например, можно указать тип int|string, что означает, что переменная может быть либо целым числом, либо строкой.
  5. Named Arguments: В PHP 8 появилась возможность передавать аргументы функций по имени, что упрощает чтение и понимание кода, особенно при работе с функциями с большим количеством аргументов.
  6. Attributes: PHP 8 представляет атрибуты (Attributes), которые позволяют добавлять метаданные к классам, методам, свойствам и другим элементам кода. Атрибуты используются для аннотирования и декларативного описания кода.
  7. Множество других улучшений: PHP 8 также включает множество других улучшений, таких как улучшенная поддержка ошибок и исключений, новые функции стандартной библиотеки, улучшения встроенных функций и многое другое.
PHP 7: Улучшенная производительность, Скалярные типы и строгая типизация, Оператор объединения объединяющий null, Строгая обработка ошибок, Оператор spaceship, Декларативные типы возвращаемых значений
  1. Улучшенная производительность: новый движок Zend Engine 3.0, который значительно улучшает производительность выполнения кода.
  2. Скалярные типы и строгая типизация: PHP 7 вводит возможность объявления скалярных типов (int, float, string, bool) для аргументов функций и возвращаемых значений. Это помогает улучшить надежность кода и облегчает обнаружение ошибок.
  3. Оператор объединения объединяющий null: В PHP 7 добавлен оператор объединения объединяющий null (??), который позволяет указывать значение по умолчанию, если переменная равна null. Это помогает упростить и сократить код при работе с переменными, которые могут быть null.
  4. Строгая обработка ошибок: PHP 7 включает более строгую обработку ошибок и выбрасывание исключений при выполнении операций, которые ранее приводили к неявным предупреждениям или непредсказуемым результатам. Это помогает улучшить качество кода и упростить отладку.
  5. Оператор spaceship: В PHP 7 добавлен оператор spaceship (<=>), который позволяет сравнивать два значения и возвращать отрицательное число, ноль или положительное число в зависимости от их отношения. Это упрощает сортировку и сравнение значений.
  6. Декларативные типы возвращаемых значений: PHP 7 вводит возможность указывать типы возвращаемых значений для функций и методов. Это помогает улучшить документирование кода и обеспечить соответствие ожидаемых типов.
  7. Синтаксические улучшения: PHP 7 включает несколько синтаксических улучшений, таких как использование define() для констант массивов, сокращенное синтаксиса для объявления массивов и другие мелкие улучшения, которые упрощают и улучшают читаемость кода.

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

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

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

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

10. Что такое сериализация?

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

11. Есть ли в PHP множественное наследование и как можно реализовать?

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

12. В чем отличие абстрактного класса от интерфейса.

Абстрактный класс представляет собой класс, который не может быть инстанциирован напрямую, с определённым состоянием и интерфейсом для реализации в производных классах. Указывает на замещение (это принцип подстановки Барбары Лисков) Он может содержать как абстрактные методы, так и конкретные методы, наследовать можно только один класс.

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

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

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

13. Что такое трейты, для чего используются и какие есть достоинства и недостатки есть?

Трейты (traits) - это механизм в PHP, который позволяет повторно использовать код в классах.

Достоинства

  1. Повторное использование кода
  2. Горизонтальное расширение (получение функциональности из разных источников)

Недостатки

  1. Зависимость от трейтов (при изменении в одном месте может привести к непредсказуемым результам)
  2. Возможные конфликты имен
  3. Сложность отслеживания зависимостей

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

Класс - это конструкция языка для описания свойств, структуры и действий объектов. Класс является абстракцией и не имеет конкретных значений или состояния.

Объект - это экземпляр класса. Когда создается объект, он занимает физическую память и получает состояние, определенное в классе.

15. Какие структуры знаешь в STL?

SplDoublyLinkedList, SplStack, SplQueue, SplHeap

16. Какие алгоритмы хеширование знаешь?

MD5, SHA-256, Argon2, bcrypt

17. Какие знаете алгоритмы сортировки и какие O(n)?

Сортировка слиянием (n*logn), Пузырьком (n^2), Быстрая сортировка(n^2)

18. Зачем нужны итераторы?

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

19. Какова сложность функции strlen в О-нотации в PHP ?

strlen O(1) - получает длину из структуры zval

mb_strlen O(n) - зависит от кодировки

20. Чем отличается многопоточное от асинхронного

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

Асинхронность относится к модели выполнения, в которой одна задача не блокирует выполнение других задач. В асинхронном программировании используются события, обратные вызовы (callbacks) или промисы (promises) для управления выполнением задач

21. Что такое семафор, мьютекс

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

Cемафор - контролирует доступ к ресурсу посредством счетчика и позволяет ограниченному количеству потоков или процессов одновременно получать доступ

Мьютекс - обеспечивает эксклюзивный доступ для одного потока или процесса за раз.

22. Как происходит кодировка в UTF-8

Этот формат использует в основном 8-битные байты для представления символов. Определение кодировки происходит по символу BOM в начале документа или анализу последовательности байтов.

Процесс кодирования в UTF-8 выглядит следующим образом:

  • Каждый символ переводиться в свой уникальный код Юникода
  • Каждый символ Юникода представляется в виде кодовой точки U+, которая является шестнадцатеричным значением его уникального кода Юникода
  • Каждая кодовая точка преобразуется в байтовое представление

23. Какие оценки сложности знаешь?

Константный — O(1) Порядок роста O(1) означает, что вычислительная сложность алгоритма не зависит от размера входных данных. Следует помнить, однако, что единица в формуле не значит, что алгоритм выполняется за одну операцию или требует очень мало времени.
Линейный — O(n) Порядок роста O(n) означает, что сложность алгоритма линейно растет с увеличением входного массива. Такие алгоритмы легко узнать по наличию цикла по каждому элементу входного массива.
Логарифмический – O(n·log n) Порядок роста O(n·log n) означает, что время выполнения алгоритма растет логарифмически с увеличением размера входного массива. Большинство алгоритмов, работающих по принципу «деления пополам», имеют логарифмическую сложность.
Квадратичный — O(n^2) Время работы алгоритма с порядком роста O(n^2) зависит от квадрата размера входного массива. Проблема в том, что они плохо масштабируются.

24. Какие преимущества дают атрибуты PHP 8 по сравнению с анотациями?

Нативная поддержка Поддерживаются непосредственно интерпретатором не требуют использования сторонних фреймворков или библиотек.
Более гибкий синтаксис Можно определять свои собственные классы атрибутов с определенными методами и свойствами, что дает больше возможностей для метапрограммирования и изменения поведения кода.
Лучшая интеграция с инструментами разработки Атрибуты легко читаются и обрабатываются инструментами разработки и анализа кода.
Семантическая информация Позволяют добавлять семантическую информацию к коду, что может быть полезно для документирования и понимания его назначения и использования. Например, вы можете добавить атрибуты, указывающие на типы аргументов метода, возможные исключения или другие сведения, которые помогут разработчикам понять, как использовать ваш код.
Широкая поддержка в экосистеме PHP Это означает, что вы можете использовать атрибуты в своих проектах и быть уверенными в их совместимости и поддержке в различных контекстах.

25. Хэширование, кодирование, шифрование в чём отличие?

Хэширование: Одностороннее преобразование данных для создания фиксированной длины хэш-значения.

Кодирование: Преобразование данных в другую форму без цели обеспечения безопасности для целостности и передачи данных.

Шифрование: Преобразование данных с использованием ключа для обеспечения конфиденциальности.

26. Что такое FPM

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.

26. Что такое Race Condition?

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

27. Как избежать Race Condition?

  • Использование блокировок (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

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

28. Для чего нужен codeReview?

Для улучшения кодовой базы

29. Как проверять codeReview?

  • Надо ли это вообще, в правильном ли месте код
  • Соответствие условию задачи
  • Код соответствует стайл гайдам.
  • Хорошо ли спроектирован код
  • Функциональность хорошо сделана с точки зрения пользователей этого кода, кем бы они ни были.
  • Внешний вид (если есть) должен быть хорошим
  • Учтены все нюансы параллельного программирования (если есть).
  • Код не переусложнен SOLID, DRY, KISS, YAGNI, BDUF, APO
  • Производительность
  • Безопасность: Проверка на уязвимости, валидация данных
  • Правильно ли работают выборки
  • У кода есть тесты
  • Тесты хорошо спроектированы - Учитываются ли все граничные случаи
  • Наименования (для всего) выбраны хорошо
  • Комментарии к коду понятны и необходимы. Они должны объяснять, почему так сделано, а не как это сделано.
  • Добавлена документация.
  • Помечать мелочи и предирки nit

29. Как решать споры codeReview?

Обсудили в коментах -> Обсудили лично -> Обсудили в команде -> Двигаемся дальше

Назад