Библиотека собеса по PHP | вопросы с собеседований
Kanalga Telegram’da o‘tish
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/9f3affba Для обратной связи: @proglibrary_feeedback_bot
Ko'proq ko'rsatish3 151
Obunachilar
Ma'lumot yo'q24 soatlar
-37 kunlar
-430 kunlar
Postlar arxiv
Что такое sensitive данные? Как хранятся в базе? Как отражаются в логах?
Sensitive данные (чувствительные данные) – это информация, которая является приватной, конфиденциальной или важной для безопасности организации или пользователя. К таким данным относятся, например, пароли, номера кредитных карт, персональные идентификационные номера и т.д.
Хранение sensitive данных в базе данных требует особых мер безопасности, чтобы предотвратить несанкционированный доступ. Важной практикой является хеширование паролей. При регистрации пользователя пароль хешируется - процесс преобразования пароля в непонятный для чтения вид. Затем хеш сохраняется в базе данных. При входе в систему, введенный пароль также хешируется, и соответствующий хеш сравнивается с сохраненным в базе данных.
Sensitive данные не должны непосредственно отражаться в логах. Вместо этого должна быть сохранена информация о том, что операция на sensitive данных была выполнена. Например, вместо того, чтобы сохранять сам пароль в логах, можно сохранить запись вроде "пользователь X изменил свой пароль". Это делается для предотвращения утечки конфиденциальной информации в случае несанкционированного доступа к логам.
Что такое SOLID, DRY, KISS, YAGNI?
SOLID:
S - Single Responsibility Principle (Принцип единственной ответственности): Каждый класс должен иметь только одну причину для изменения. Это означает, что класс должен решать только одну задачу.
O - Open/Closed Principle (Принцип открытости/закрытости): Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации. Новый функционал должен добавляться без изменения существующего кода.
L - Liskov Substitution Principle (Принцип подстановки Барбары Лисков): Объекты базового класса могут быть заменены объектами его производного класса без изменения правильности выполнения программы.
I - Interface Segregation Principle (Принцип разделения интерфейса): Клиенты не должны зависеть от интерфейсов, которые они не используют. Множество узкоспециализированных интерфейсов лучше, чем один универсальный.
D - Dependency Inversion Principle (Принцип инверсии зависимостей): Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
DRY (Don't Repeat Yourself - Не повторяйся): Идея заключается в том, чтобы избегать дублирования кода. Если у вас есть повторяющийся код, его следует вынести в отдельную функцию, метод или класс, чтобы обеспечить более легкое обслуживание и избежать возможных ошибок при изменении.
KISS (Keep It Simple, Stupid - Делай это просто, глупец): Принцип заключается в том, чтобы создавать простые, понятные решения, избегая излишней сложности. Простой код легче поддерживать, изменять и отлаживать.
YAGNI (You Ain't Gonna Need It - Вам это не понадобится): Этот принцип предупреждает от добавления функциональности, которая не является текущим требованием. Не следует создавать код, который предназначен для использования в будущем, но который на данный момент не требуется. Фокус должен быть на текущих требованиях.
Эти принципы SOLID и практики DRY, KISS, YAGNI являются основой для создания гибкого, устойчивого и легко поддерживаемого кода.
Сравните include vs required, include_once vs required_once.
Когда речь идет о подключении файлов в PHP, часто используются две пары ключевых слов: include и require, а также include_once и require_once. Давайте рассмотрим их основные различия и сравним их:
include vs require:
include: Используется для включения файла в скрипт. Если файл не найден, PHP выдаст предупреждение, но выполнение скрипта продолжится.
require: Используется для включения файла, и если файл не найден, PHP генерирует фатальную ошибку и останавливает выполнение скрипта.
Рекомендация: Если файл является критически важным для работы скрипта, используйте require, чтобы предотвратить выполнение скрипта в случае отсутствия файла. В противном случае, если вы хотите продолжить выполнение скрипта при отсутствии файла, используйте include.
include_once vs require_once:
include_once: Подключает файл только один раз. Если файл уже был включен ранее, он не будет включен снова.
require_once: Аналогично include_once, но для ключевого слова require. Гарантирует, что файл будет включен только один раз.
Рекомендация: Используйте *_once, если существует вероятность, что файл может быть включен несколько раз, чтобы избежать конфликтов и ошибок.
Какие различия между первичным и уникальным ключами?
"Первичный ключ" (Primary Key) и "уникальный ключ" (Unique Key) - это оба типа ограничений баз данных, используемых для обеспечения уникальности значений в столбцах таблиц. Однако существуют определенные различия в их использовании и семантике:
Уникальность:
Первичный ключ: Одна из основных особенностей первичного ключа - это то, что он должен быть уникальным для каждой записи в таблице. Он не может содержать значения NULL, и каждая строка в таблице должна иметь уникальное значение первичного ключа.
Уникальный ключ: Уникальный ключ также гарантирует уникальность значений в столбце или группе столбцов. Однако в отличие от первичного ключа, столбец, имеющий уникальный ключ, может содержать значение NULL, и таблица может иметь несколько строк с NULL в уникальном ключе.
NULL-значения:
Первичный ключ: Не может содержать NULL-значений. Все значения первичного ключа должны быть заполнены.
Уникальный ключ: Может содержать одно NULL-значение. Если столбец с уникальным ключом разрешает NULL, то однако может быть только одна строка с NULL в этом столбце.
Число ключей:
Первичный ключ: В таблице может быть только один первичный ключ.
Уникальный ключ: В таблице может быть несколько уникальных ключей. Каждый уникальный ключ предоставляет другой способ гарантировать уникальность значений.
Семантика использования:
Первичный ключ: Используется для однозначной идентификации каждой строки в таблице. Часто используется в качестве внешнего ключа в других таблицах.
Уникальный ключ: Используется для обеспечения уникальности значений, но не обязательно для идентификации каждой строки. Может использоваться, например, для уникальных номеров телефонов или электронных адресов в таблице клиентов.
Что нового в РНР 8?
1. Just-in-Time компиляция (JIT): В PHP 8 была добавлена возможность JIT компиляции, что может улучшить производительность вашего приложения. JIT-компиляция позволяет выполнять оптимизацию кода на лету.
2. Улучшенная типизация: В PHP 8 была добавлена более строгая типизация, включая поддержку статического анализа типов. Теперь вы можете определить ожидаемые типы аргументов функций и возвращаемые значения.
3. Атрибуты: PHP 8 вводит новую концепцию атрибутов, позволяющих применять метаданные к классам, методам и свойствам. Атрибуты потенциально полезны для разработчиков фреймворков и библиотек, чтобы добавить дополнительную информацию о коде.
4. Отлов исключений: PHP 8 добавляет возможность отлавливать несколько исключений в одном операторе catch. Теперь вы можете указать несколько типов исключений через вертикальную черту, например: catch (Exception1 | Exception2 $e).
5. Nullsafe оператор: В PHP 8 был добавлен новый оператор "?->", который облегчает работу с объектами, которые могут быть null. Этот оператор позволяет безопасно и удобно обращаться к свойствам и методам объектов, проверяя наличие значения null.
6. Много других улучшений: PHP 8 содержит еще множество других улучшений, таких как улучшения в ядре, новые функции, оптимизации и исправления ошибок. Все нововведения можно увидеть тут
Cуперглобальные массивы.
Суперглобальные массивы в PHP - это предопределенные глобальные переменные, которые доступны из любой области видимости в скрипте. Некоторые из наиболее распространенных суперглобальных массивов в PHP:
1. $_GET: содержит переменные, переданные из строки запроса URL в качестве параметров. Они обычно используются для передачи данных через URL.
2. $_POST: содержит переменные, отправленные через HTTP POST-запросы. Этот массив обычно используется для передачи данных из формы на сервер.
3. $_SESSION: хранит переменные сессии пользователя. Эти данные могут быть доступны на протяжении всей сессии пользователя.
4. $_COOKIE: содержит переменные, переданные клиентом через HTTP-куки. Они обычно используются для сохранения долговременных данных о состоянии пользователя.
5. $_SERVER: содержит информацию о сервере и окружении, в котором выполняется текущий скрипт.
6. $_FILES: содержит информацию о файлах, загруженных на сервер через форму загрузки файлов.
Про остальные можно узнать в документации
Какие виды кеш-хранилищ знаете?
Существует несколько видов кеш-хранилищ:
1. Файловое кеш-хранилище (File-based cache): Использует файловую систему для хранения кеша. Данные кеша хранятся в файлах на диске и обычно используются, чтобы кешировать небольшие объемы данных, такие как отдельные HTML-страницы или фрагменты.
2. Memcached: Распределенная система кеширования, которая хранит данные в оперативной памяти (RAM). Он быстро доступен и эффективно обрабатывает большие объемы данных. Memcached может быть использован для кеширования запросов к базе данных, API-запросов и других операций для увеличения производительности.
3. Redis: Высокопроизводительная система управления базами данных, которая также может использоваться как кеш-хранилище. Redis поддерживает различные типы данных и предлагает расширенные функции, такие как публикация/подписка и сортированные множества. Это обычно используется для кеширования запросов к БД, хранения временных данных и ускорения работы приложений.
4. APCu: Расширение для PHP, которое предоставляет хранилище кеша в памяти на уровне оперативной памяти (RAM). Оно подходит для кеширования небольших объемов данных и часто используется для кеширования результатов вычислений, загружаемых файлов и других операций.
5. Zend OPCache: Расширение для PHP, которое выполняет опкод-кэширование для улучшения производительности. Оно кеширует скомпилированный байт-код PHP-файлов, чтобы избежать необходимости повторной компиляции каждый раз при выполнении скрипта. Про него мы недавно рассказывали
Отличие между ними заключается в различном способе хранения данных кеша, масштабируемости, скорости доступа и функциональности. Файловое кеш-хранилище хранит данные на диске, в то время как Memcached, Redis, APCu и Zend OPCache используют оперативную память для хранения данных. Memcached и Redis являются распределенными системами, позволяющими горизонтальное масштабирование, в то время как остальные кеш-хранилища ограничены доступом только к одному серверу. Каждый вид кеш-хранилища имеет свои сильные и слабые стороны, и выбор зависит от требований конкретного проекта и его бюджета.
Что такое Mock? Где используют и зачем?
Mock (в переводе с английского - подделка, имитация) - это объект, который имитирует поведение реальных объектов в программе. Он создается на основе интерфейса или класса, чтобы предоставить возможность эмулировать определенные методы и поведение, которое необходимо для тестирования или разработки.
Моки особенно полезны при разработке и тестировании, когда некоторые зависимости программы еще не реализованы или недоступны. Они позволяют испытывать функциональность кода, не завися от реальных объектов, а также создавать ситуации, которые могут быть сложными или невозможными в реальной системе.
В PHP разработке моки часто используются при юнит-тестировании для изоляции кода и проверки его работы в изоляции от других модулей и зависимостей. Создание моков позволяет задавать ожидания к вызовам методов, проверять их вызовы, а также контролировать возвращаемые значения или генерировать исключения.
Использование моков упрощает создание тестовых сценариев, позволяет эффективно проверять код и обнаруживать потенциальные проблемы. Это также помогает ускорить процесс разработки, так как не требуется полная реализация всех зависимостей для тестирования каждого компонента отдельно.
Что такое traits?
Traits в PHP - это механизм, который позволяет повторно использовать код в классах без необходимости использования множественного наследования. Traits предоставляют решение для проблемы, когда несколько классов должны иметь одинаковый функционал, но наследование не является подходящим вариантом.
Также traits позволяют разделить функционал, что упрощает структуру кода и делает его более логичным и понятным.
Альтернативным решением для использования функционала traits может быть использование интерфейсов. Однако интерфейсы требуют реализации всех методов, которые определены в интерфейсе, в классе, в то время как трейты могут предоставлять реализацию функционала по умолчанию.
Оба варианта имеют свои преимущества, но трейты в PHP предоставляют большую гибкость при повторном использовании кода в разных классах.
Как вы понимаете Special Case / Null Object и где его следует применять?
Special Case / Null Object - это шаблон проектирования, который используется для обработки специальных случаев или значений отсутствия объекта. Он позволяет разработчику избежать проверок на null и обрабатывать такое отсутствие объекта по-особенному.
Null Object - это класс, который реализует интерфейс или абстрактный класс, используемый вместо null. Он предоставляет реализацию методов, которые обрабатываются для отсутствующего объекта, и возвращает пустые значения или выполняет пустые действия.
Null Object можно применять, когда требуется обработать отсутствие объекта без использования проверок на null. Он может быть полезен в таких ситуациях:
1. Вместо проверки на null, можно использовать Null Object, чтобы избежать возникновения исключений или ошибок, связанных с отсутствием объекта и его методов.
2. Null Object может упростить код и избавить от необходимости писать дополнительные условия для обработки null значений.
3. Он также может быть полезен в шаблонном методе, когда необходимо иметь базовую реализацию методов, которые могут быть переопределены в подклассах, и одновременно обрабатывать отсутствие объекта.
Пример применения Null Object в PHP на фото выше
В этом примере, если использовать NullLogger, то метод log не выполняет никаких действий и не вызывает ошибок при отсутствии файла или других ресурсов, которые могут быть связаны с реальным логгером.
Как хранить координаты точки на карте в БД?
Рассмотрим несколько возможных подходов:
1. Хранение отдельных полей с широтой и долготой:
- Создайте две числовые колонки в таблице БД, например, "latitude" и "longitude", представляющие широту и долготу соответственно.
- Для каждой точки, сохраните ее координаты в эти поля.
- При поиске точек на карте, вы можете использовать операторы сравнения или функции, поддерживаемые БД, для поиска точек в определенном радиусе или в пределах определенной географической области.
2. Использование географических типов данных:
- Некоторые реляционные БД, такие как MySQL с расширением Spatial, PostgreSQL с расширением PostGIS или SQLite с поддержкой расширения SpatiaLite, предоставляют специальные типы данных для работы с географическими объектами.
- Создайте колонку с типом данных для хранения географической информации, например, тип "Point", который позволяет хранить точку с заданными координатами.
- Сохраняйте информацию о точках на карте в этой колонке.
- Используйте функции и операторы, поддерживаемые соответствующим расширением БД, для выполнения географических запросов, таких как поиск точек в определенном радиусе или внутри границ определенного полигона.
Что делает оператор yield?
Когда оператор yield вызывается внутри функции, она превращает эту функцию в генератор. Он возвращает следующее значение из генератора и приостанавливает его выполнение, сохраняя его текущее состояние. При следующем вызове оператора yield выполнение продолжится с того же места, где остановилось.
Оператор yield может использоваться для итерации через массивы, коллекции или базы данных без необходимости загружать все значения сразу. Он также может использоваться вместе с оператором foreach для упрощения обработки больших объемов данных.
Стоит ли возвращать null из методов. Если нет, то почему и как писать код в таких случаях?
Когда речь идет о возвращении значения из методов, лучше избегать возвращения null, так как это может привести к ошибкам и сложностям при обработке результата функции. Вместо этого, важно возвращать объекты или значения-заглушки, которые явно указывают на определенное состояние или ситуацию.
Если метод не может вернуть ожидаемый результат или найти запрошенное значение, то лучше выбросить исключение, чтобы проинформировать о такой ситуации и позволить соответствующей обработке ошибок или выполнению альтернативных действий. Если метод не может найти результат, который можно обозначить специальным значением, можно вернуть значение-заглушку, которое явно указывает на отсутствие результата или ошибку. Это может быть пустой массив, пустой объект, пустая строка или целое число, имеющее конкретное значение, которое в вашем контексте обозначает отсутствие результата.
Класс содержит свойство, которое, в свою очередь, является объектом. Что будет содержать это свойство в клонированном объекте: ссылка на тот же дочерний объект или копию дочернего объекта? Что нужно сделать, чтобы это изменить?
При клонировании объекта, свойство, которое является объектом, будет содержать ссылку на тот же дочерний объект, а не его копию.
Чтобы изменить это поведение и создать копию дочернего объекта в клонированном объекте, необходимо определить метод
__clone() для класса. В этом методе можно явно создать копию дочернего объекта и присвоить ее свойству клонируемого объекта.
Пример реализации на фотоЧто такое денормализация? Для чего она нужна?
Денормализация – это процесс организации реляционной базы данных, при котором избегается нормализация для повышения эффективности чтения данных.
Денормализация нужна для оптимизации производительности базы данных в ситуациях, когда нужно быстро и эффективно получать данные, особенно в случаях, когда запросы на чтение данных являются частыми и требуют многих операций соединения таблиц.
Денормализация может применяться, когда нужно улучшить производительность при получении данных из базы данных за счет уменьшения количества соединений таблиц, упрощения запросов и сокращения времени выполнения запросов. Однако, важно помнить, что денормализация может привести к повышению избыточности данных и усложнению поддержки базы данных.
Следует ли использовать в методах значение по умолчанию null. Если нет, то почему?
Вопрос о том, следует ли использовать значение по умолчанию null в методах, зависит от конкретного случая и удовлетворения требований вашего проекта.
Если ваш метод принимает параметр, которому обязательно должно быть передано значение, вы должны использовать значение по умолчанию, которое является валидным значением для данного параметра. В таком случае использование null может быть нежелательным, так как это может привести к ошибкам в работе метода или неожиданным поведением.
Однако, если параметр необязательный и может быть опущен, то использование значения по умолчанию null допустимо. Это дает гибкость пользователю функции в выборе использования параметра.
В то же время, использование значений по умолчанию может создавать сложности при отладке и поддержке кода, особенно если вы работаете с большим проектом или командой разработчиков. Вы должны тщательно обдумать, как использование значений по умолчанию влияет на читаемость, понятность и надежность вашего кода.
Что может содержать интерфейс?
Интерфейс в PHP может содержать следующие элементы:
1. Методы: интерфейс может определять сигнатуры методов, которые должны быть реализованы в классах, которые реализуют этот интерфейс.
2. Константы: интерфейс может содержать константы, которые будут доступны для использования в классах, реализующих этот интерфейс.
3. Наследование: интерфейс может наследовать один или несколько других интерфейсов, что позволяет определить общие сигнатуры методов и констант в более высокоуровневом интерфейсе.
В этом примере функция numberGenerator является генератором, который создает последовательность чисел от 1 до заданного предела. Когда вы запускаете этот код, он выведет: 1 2 3 4 5.
Преимущества использования генераторов:
Экономия памяти: Генераторы не загружают все значения в память сразу, что позволяет работать с большими объемами данных.
Ленивые вычисления: Генераторы используются по мере необходимости, что позволяет выполнять ленивые вычисления только для запрошенных значений.
Удобство работы с большими данными: Позволяют обрабатывать большие наборы данных пошагово без необходимости загрузки их полностью в память.
Генераторы в PHP - это мощный инструмент для работы с данными, особенно когда вы имеете дело с большими или потенциально бесконечными наборами данных.
Что такое генераторы и как их использовать?
В PHP генераторы - это специальный тип итератора, который позволяет создавать итераторы по требованию. Они предоставляют удобный способ работы с большими наборами данных, не загружая их все в память сразу. Генераторы помогают оптимизировать использование памяти и улучшают производительность в случаях, когда нам нужно обработать большой объем данных пошагово.
Генераторы создаются с использованием ключевого слова yield. Когда функция с yield возвращает значение, она "замораживается" на этом месте, сохраняя свою текущую структуру и состояние. Когда генератор запрашивает следующий элемент, он продолжает выполнение функции с того места, где остановился ранее.
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
