Библиотека собеса по PHP | вопросы с собеседований
Ir al canal en Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/5JWKxA Для обратной связи: @proglibrary_feeedback_bot
Mostrar más3 113
Suscriptores
+124 horas
-107 días
-1830 días
Archivo de publicaciones
Индексы в SQL для PHP-разработчиков
Индексы в базах данных считаются "волшебной палочкой" для решения многих проблем при разработке веб-приложений. Впрочем, опытные программисты знают, что из этой палочки в любой момент может вылететь "Авада Кедавра".
Чтобы научиться осознанно пользоваться индексами в SQL и ускорить свои приложения, присоединяйтесь к открытому уроку 26 июня в 20:00!
На уроке ты:
1. Разберёшься, что такое индексы и как они работают в PostgreSQL и MySQL.
2. Научишься грамотно проектировать индексы под свои данные и запросы.
3. Узнаешь о неочевидных особенностях индексов, которые могут всё сломать, и как их избежать.
Твой гид в мир быстрых баз данных — Дмитрий Кириллов, соучредитель и технический директор 1С-Старт, опытный разработчик.
Регистрируйтесь прямо сейчас, чтобы попасть на открытый урок: https://otus.ru/lessons/razrabotchik-php/?utm_source=telegram&utm_medium=cpm&utm_campaign=php&utm_content=lesson_26-06-2024_usp-universal_php__no-headline_aida_long_banner_no-banner-hl_blue_standart&utm_term=php_interview_lib#event-4436
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru Erid 2VtzqwSKzRVЧто такое type hinting, как работает, зачем нужен?
Type hinting в PHP — это возможность указывать ожидаемые или допустимые типы данных для параметров функций и функций-обратного вызова (callback). Он используется для определения типов аргументов функций и возвращаемых значений.
Type hinting выполняется при помощи объявления типа данных перед именем параметра функции или функции-обратного вызова.
В данном случае мы указываем, что параметры $a и $b должны быть целочисленного типа (int), а функция должна возвращать тоже целочисленное значение. Если будет передан несоответствующий тип данных, то PHP выдаст ошибку.
Type hinting в PHP имеет следующие преимущества и цели:
1. Увеличение надежности и безопасности кода: Type hinting позволяет контролировать типы данных, которые принимаются и возвращаются функциями, что может помочь предотвратить ошибки типизации и некорректное использование функций.
2. Улучшение понимания кода: Type hinting делает код более читаемым и понятным, особенно при работе в команде. Видя ожидаемые типы данных в объявлениях функций, другие разработчики легко могут понять, какие данные ожидаются для правильного использования функции.
3. Интеграция со средами разработки: Многие среды разработки, такие как PhpStorm, могут использовать информацию о типах данных для предоставления подсказок и автодополнения, что упрощает разработку и ускоряет процесс написания кода.
Однако, следует отметить, что type hinting в PHP не является строгой типизацией. Если передать аргумент, не соответствующий указанному типу, PHP будет пытаться выполнить приведение типов, что может привести к непредсказуемому поведению программы.
Что такое gap locks в MySQL?
Gap locks в MySQL — это блокировки, применяемые на диапазоне значений индексов таблицы, но не на конкретную запись. Они используются для решения проблем с возможными фантомными чтениями и уровнем изоляции транзакций.
Когда выполняется операция SELECT с условием по диапазону значений, MySQL устанавливает gap lock на промежуток (gap) между найденными итемами или между первым и последним итемами в результате выборки. Gap lock блокирует вставку или обновление других записей, которые попадают в этот промежуток, и предотвращает получение непоследовательных данных другими транзакциями.
Gap locks обеспечивают последовательность данных при выполнении поисковых запросов с условиями по диапазону значений в многопользовательской среде. Они помогают предотвратить возможные конфликты между транзакциями и гарантируют консистентность данных.
Однако, стоит отметить, что использование gap locks может увеличить вероятность блокировки и снизить производительность в высоконагруженных средах. Поэтому, при разработке приложений на PHP с использованием MySQL, важно тщательно оценить необходимость использования gap locks и продумать стратегию обработки блокировок для обеспечения оптимальной производительности и надежности системы.
Как масштабировать PHP-приложение, чтобы оно выдерживало высокую нагрузку, и каковы некоторые связанные с этим проблемы?
Для масштабирования PHP-приложения можно использовать горизонтальное масштабирование, при котором несколько экземпляров приложения могут работать на разных серверах за балансировщиком нагрузки. Это поможет справиться с высокой нагрузкой. Одной из проблем является обеспечение согласованности данных в нескольких экземплярах приложения.
Другая задача — обеспечить эффективную связь между экземплярами приложения и гарантировать, что каждый экземпляр имеет достаточно ресурсов, чтобы справиться с нагрузкой. Для снижения нагрузки на серверы можно также использовать методы кэширования и оптимизации.
🎭 Bytemask \\
Bytemask — плагин Gradle для Android, который маскирует секретные строки приложения в исходном коде, затрудняя их извлечение с помощью реверс-инжиниринга. Он шифрует строки во время компиляции с помощью ключа подписи приложения и расшифровывает во время выполнения.
Ссылка на Github
#полезное #библиотека
Как использовать репозиторий в контроллере в Symfony, написав код?
Чтобы использовать репозиторий в контроллере Symfony, выполните следующие шаги:
Определите репозиторий: Убедитесь, что у вас есть класс репозитория, определённый для вашей сущности. Symfony обычно автоматически генерирует эти классы при создании сущности.
Инжектируйте репозиторий в контроллер: Используйте внедрение зависимостей, чтобы инжектировать репозиторий в ваш контроллер. Это можно сделать через конструктор или напрямую в методе контроллера.
Опишите поведение при использовании traits с одинаковыми именами полей и / или методов?
При использовании traits с одинаковыми именами полей и/или методов, возникает конфликт имен, который не позволяет PHP однозначно определить, какое поле или метод должны использоваться.
Если в классе используется несколько traits, и в этих traits есть поля или методы с одинаковыми именами, возникает ошибка компиляции «trait method has not been applied», или «trait field has not been applied». По сути, PHP не знает, из какого trait следует взять поле или метод.
Для разрешения этого конфликта имен трейт может быть использован с использованием псевдонима. Например, можно использовать ключевое слово insteadof, чтобы указать, какой метод или поле должно использоваться
Также в PHP 7.2 и выше была добавлена возможность адаптировать методы или конфликтующие поля с помощью оператора as.
С помощью таких алиасов можно явным образом указать, какой метод или поле следует использовать из каждого трейта.
Как использовать принцип инверсии управления в Laravel?
Принцип инверсии управления(Inversion of Control, IoC) используется в Laravel для разделения реализации компонента и его использования. В Laravel это достигается за счет использования контейнера сервисов, который предоставляет возможность регистрировать и разрешать зависимости для вашего приложения. Вот пример использования контейнера сервисов для разрешения зависимостей
В этом примере мы используем контроллер UserController для отображения списка пользователей. Мы инжектируем экземпляр UserRepository в конструктор контроллера. Класс UserRepository отвечает за получение и хранение данных для модели User.
Используя инъекцию зависимостей, мы отделяем UserController от класса UserRepository. Это позволяет нам легко заменить UserRepository на другую реализацию, не меняя при этом код в UserController.
Что такое JIT? Как он работает?
JIT (Just-In-Time) компиляция представляет собой метод оптимизации выполнения кода, при котором код не компилируется заранее в процессе разработки, а только перед фактическим его выполнением во время работы программы. Это позволяет улучшить производительность программы за счет оптимизаций, которые могут быть применены с учетом конкретных условий выполнения.
Как это работает:
Исходный код на PHP: Начинаем с написания нашего кода на PHP, который является языком сценариев с динамической типизацией.
Компиляция в промежуточный код (opcode): Исходный код PHP компилируется в промежуточный байт-код, который представляет собой некий промежуточный представитель нашего кода, близкий к машинному коду, но все еще независимый от конкретной аппаратной платформы.
Исполнение байт-кода: Этот байт-код может быть интерпретирован непосредственно виртуальной машиной PHP (Zend VM), что происходит по умолчанию. Однако, в контексте JIT, в определенный момент, когда интерпретатор PHP обнаруживает, что некий участок кода используется достаточно часто, он может решить скомпилировать этот участок кода в машинный код «на лету».
JIT-компиляция: В процессе выполнения программы JIT-компилятор анализирует и оптимизирует участки кода, которые часто выполняются. Это позволяет улучшить производительность, так как оптимизации адаптированы к конкретному исполняющемуся коду и платформе.
Выполнение оптимизированного кода: После JIT-компиляции оптимизированный машинный код заменяет соответствующий участок байт-кода, что может значительно ускорить выполнение программы.
Этот подход позволяет более эффективно использовать ресурсы и достигнуть лучшей производительности в сравнении с чистым интерпретатором.
Как использовать «PHPUnit» для написания модульных тестов для PHP-приложений, и каковы лучшие практики для этого?
PHPUnit — это широко используемый фреймворк для написания модульных тестов в PHP. Он позволяет разработчикам писать тестовые примеры, чтобы убедиться, что отдельные части кода работают так, как ожидается.
Для запуска тестов можно использовать команду phpunit. Лучшие практики модульного тестирования включают в себя написание независимых, повторяемых и легко поддерживаемых тестов, использование фикстур для создания тестовых данных, а также тестирование как положительных, так и отрицательных случаев.
Что такое фильтр Блума?
Фильтр Блума — это вероятностная структура данных, которая используется для тестирования принадлежности элемента множеству. Он может давать ложные положительные результаты, но никогда не дает ложных отрицательных. Это значит, что если фильтр Блума говорит, что элемент принадлежит множеству, это может быть не так (ложное срабатывание), но если фильтр говорит, что элемент не принадлежит множеству, это точно так.
Подробнее в статье
Proglib запускает канал Азбука айтишника
Подписывайтесь на наш новый канал про айти для неайтишников — для совсем новичков и тех, кто постоянно взаимодействует с айтишниками.
У нас есть рубрики:
⭐ База — в ней рассказываем про термины из IT простым языком
⭐ Проект — объясняем, из чего состоят айтишные проекты и сколько они могут стоить
⭐ Психология айтишника — тут говорим про софт-скиллы, особенности работы и взаимодействия
👉Подписывайтесь!
Каковы основные компоненты Symfony и как они взаимодействуют друг с другом?
Symfony состоит из нескольких ключевых компонентов, которые взаимодействуют между собой, создавая надежный PHP-фреймворк. Компонент HttpFoundation заменяет глобальные переменные PHP объектно-ориентированным слоем, что позволяет проще работать с HTTP-запросами и ответами. Routing управляет генерацией и подбором URL, а EventDispatcher позволяет разделить код с помощью слушателей событий. DependencyInjection обеспечивает функциональность контейнера сервисов, способствуя многократному использованию и тестированию кода.
HttpKernel выступает в качестве ядра, используя другие компоненты для обработки запросов и генерации ответов. Он использует EventDispatcher для отправки нескольких событий во время обработки запроса, что позволяет внедрять пользовательское поведение в различных точках. Например, он отправляет событие 'kernel.request', которое может быть использовано Routing для сопоставления запроса с маршрутом и определения контроллера.
Компонент Twig — это шаблонизатор Symfony, взаимодействующий с HttpKernel для рендеринга представлений. Doctrine ORM взаимодействует с базой данных, обеспечивая персистентность данных.
Security обеспечивает аутентификацию и авторизацию, тесно взаимодействуя с HttpKernel и EventDispatcher. Translation помогает в интернационализации, а Validator обеспечивает соблюдение правил проверки объектов.
👀Что из этого сгенерировала нейросеть?
Подписывайтесь на наш новый канал про нейросети для создания изображений, там есть:
🌸Новые нейросети и инструменты, например, вот модель генерирует картинки по наброску
🌸Промты для разных задач
🌸Лайфхаки по использованию нейросетей
👉Подписывайтесь!
🎮Новый канал по разработке игр
Мы наконец-то запустили канал по разработке игр — теперь все самое важное и полезное из мира геймдева можно узнать в одном месте.
👉Подписаться
Что такое traits?
Traits в PHP — это механизм, который позволяет повторно использовать код в классах без необходимости использования множественного наследования. Traits предоставляют решение для проблемы, когда несколько классов должны иметь одинаковый функционал, но наследование не является подходящим вариантом.
Также traits позволяют разделить функционал, что упрощает структуру кода и делает его более логичным и понятным.
Альтернативным решением для использования функционала traits может быть использование интерфейсов. Однако интерфейсы требуют реализации всех методов, которые определены в интерфейсе, в классе, в то время как трейты могут предоставлять реализацию функционала по умолчанию.
Оба варианта имеют свои преимущества, но трейты в PHP предоставляют большую гибкость при повторном использовании кода в разных классах.
Так как каждый класс может реализовать множество трейтов, могут возникать конфликты когда один и тот же метод реализован в разных трейтах и/или самом классе. Подробней о трейтах в документации.
Как использовать Eager loading в Laravel?
Eager loading в Laravel — это способ предварительной загрузки связанных моделей, чтобы уменьшить количество запросов к базе данных и повысить производительность приложения. При использовании ленивой загрузки (lazy loading) связанные данные загружаются только тогда, когда к ним обращаются, что может привести к множественным запросам к базе данных (проблема N+1 запросов). В то время как eager loading загружает все необходимые данные заранее, используя объединение (join) или отдельные запросы с использованием ключевого слова with.
Eager loading помогает значительно снизить нагрузку на базу данных и ускорить работу приложения за счет уменьшения количества выполняемых запросов.
✍️Библиотека программиста» находится в поиске автора оригинальных статей
Кто нужен?
● Энтузиасты (джуны и выше), которые держат руку на пульсе, читают помимо книг зарубежные техноблоги
● Энтузиасты, которым есть что сказать
Тематика
● DevOps
● В четырех случаях из пяти вы предлагаете тему статьи
Объем
● От 7 до 15 тыс. знаков без учета кода
● 2-3 статьи в месяц
Оплата
● 8к руб. за статью
● Работаем с самозанятыми (компенсируем налог), ИП
Я пишу «так себе», что делать?
Чтобы написать статью, которую не стыдно опубликовать, достаточно овладеть инфостилем. У нас есть бесплатный курс для начинающих копирайтеров «Статьи для IT: как объяснять и распространять значимые идеи». Время прохождения курса: 1-2 недели.
✉️Пишите на hello@proglib.io
Как хранятся данные в redis / memcached?
В Redis данные хранятся в оперативной памяти, что обеспечивает высокую скорость доступа к данным. Redis использует структуру данных, называемую ключ-значение (key-value). Каждое значение хранится под уникальным ключом, который позволяет быстро найти и получить доступ к этим данным.
Redis поддерживает различные типы данных, включая строки, списки, множества, сортированные множества (sorted sets) и хэши. Например, для хранения строки в Redis можно использовать команду SET, где ключ — это уникальное имя, а значение — сама строка. По ключу можно получить или изменить значение, используя команду GET или SET соответственно.
Memcached также использует ключ-значение для хранения данных, но данные хранятся в оперативной памяти сервера. Memcached не поддерживает различные типы данных, он хранит все данные как массивы байтов. Обращение к данным в Memcached происходит с использованием ключа и команд get и set, похожих на Redis.
Оба этих инструмента являются ин-memory кешами, которые используются для ускорения доступа к данным, предоставляя быструю запись или чтение из оперативной памяти, минуя долгие операции чтения или записи на диск. При этом данные в Redis и Memcached не являются постоянными, поскольку они хранятся только в памяти компьютера, а не на диске. Они предназначены для хранения временных данных или данных, к которым часто обращаются.
Что такое типы форм Symfony (Symfony Form Types)?
Типы форм Symfony (Symfony Form Types) являются ключевым компонентом форм Symfony, которые предоставляют способ работы с формами в веб-приложениях. Типы форм определяют структуру и поведение формы, включая поля, которые она содержит, их типы, валидации и обработку данных.
Вот как работают типы форм Symfony:
Определение: Типы форм определяются как классы PHP, которые наследуются от класса AbstractType Symfony. Эти классы определяют поля формы, их типы, опции и любые правила валидации.
Конфигурация полей: Внутри класса типа формы вы определяете поля формы, используя методы, такие как buildForm() или configureOptions(). В этих методах вы указываете тип каждого поля (например, текст, флажок, дата) вместе с любыми опциями и ограничениями.
Отображение: Система шаблонов Symfony автоматически отображает форму на основе конфигурации, предоставленной в классе типа формы. Вы можете настроить отображение, переопределяя шаблоны или используя систему тем оформления форм Symfony.
Обработка данных: Типы форм Symfony автоматически обрабатывают привязку данных, преобразование и валидацию. Когда форма отправляется, Symfony сопоставляет отправленные данные с соответствующими полями и проверяет их в соответствии с ограничениями, определенными в типе формы.
Повторное использование: Типы форм могут использоваться повторно в разных частях приложения. Это способствует повторному использованию кода и поддерживаемости, инкапсулируя логику формы в переиспользуемый класс.
Обработка событий: Компонент форм Symfony предоставляет события, которые позволяют вам встраиваться в жизненный цикл формы и выполнять пользовательскую логику на различных этапах, таких как отправка формы или преобразование данных.
