Skip to content

DmytroTiulpa/turboweb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Тестове завдання для PHP розробників

Написати на PHP 7.1 програму:
  • Повинні існувати кілька видів собак = сіба-іну, мопс, такса, плюшевий лабрадор, гумова такса з пищалкою.
  • Собаки повинні вміти видавати звуки (гавкати, пищати) і полювати. При цьому варто пам'ятати, що мопсу полюватиме лінь, деякі іграшки не видають звуків і точно не зможуть полювати.
  • Ми можемо написати команду виду "mops sound" та отримати у відповідь "woof! woof!", далі за аналогією. Як реалізується консольний інтерфейс, значення не має.
  • Написати тести за допомогою phpunit.

Питання:

Як працюють індекси у БД?

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

  1. Структура индекса: Индекс создает отдельную структуру данных, которая содержит упорядоченные значения столбца(ов) из таблицы и ссылки на соответствующие записи. Это позволяет БД быстро определить, где находится нужное значение в индексе, и перейти к соответствующей записи в таблице.
  2. Ускорение поиска: Когда вы выполняете запросы, включающие условия WHERE, индекс позволяет БД избежать полного сканирования таблицы. Вместо этого она использует индекс, чтобы найти нужные записи быстро и эффективно.
  3. Ускорение сортировки: Индексы также помогают ускорить операции сортировки. Вместо того чтобы сортировать все записи в таблице, БД может использовать индекс для получения уже отсортированных значений.
  4. Улучшение уникальности: Индексы могут быть уникальными, что означает, что значения в индексе должны быть уникальными в пределах таблицы. Это обеспечивает целостность данных и предотвращает дублирование записей с определенными значениями.
  5. Кластерные и некластерные индексы: В зависимости от типа индекса, он может влиять на организацию данных в самой таблице. Кластерные индексы определяют физический порядок строк данных в таблице, а некластерные индексы - это отдельные структуры, которые содержат ссылки на строки.
  6. Стоимость обновлений: Индексы ускоряют операции чтения данных, но могут замедлить операции добавления, обновления и удаления записей, так как при изменении данных индексы также требуется обновлять.
  7. Выбор правильных столбцов для индексации: Выбор столбцов для индексации важен. Оптимально индексировать часто используемые в запросах столбцы, а также те, по которым происходит поиск, сортировка и объединение данных.
  8. Ограничения индексов: Индексы потребляют дополнительное место на диске, поэтому их следует использовать осторожно и с учетом потребностей приложения.

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

Які є JOIN в MySQL?

INNER JOIN: Возвращает только те строки, для которых существуют совпадающие значения в обеих таблицах.

SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

LEFT JOIN (или LEFT OUTER JOIN): Возвращает все строки из левой (первой) таблицы и соответствующие строки из правой (второй) таблицы. Если соответствия нет, то для правой таблицы будут возвращены NULL-значения.

SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

RIGHT JOIN (или RIGHT OUTER JOIN): Похож на LEFT JOIN, но возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если соответствия нет, то для левой таблицы будут возвращены NULL-значения.

SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

FULL JOIN (или FULL OUTER JOIN): Возвращает все строки из обеих таблиц, соответствующие строки объединяются, а несоответствующие заполняются NULL-значениями.

SELECT customers.customer_name, orders.order_id
FROM customers
FULL JOIN orders ON customers.customer_id = orders.customer_id;

CROSS JOIN: Выполняет декартово произведение всех строк из первой таблицы со всеми строками из второй таблицы. Этот тип JOIN создает комбинаторный результат, и его следует использовать осторожно.

SELECT *
FROM customers
CROSS JOIN orders;

Що таке dependency inversion?

Dependency Inversion (Инверсия зависимостей) - это один из принципов SOLID, который описывает подход к организации кода и зависимостей между компонентами в программе. Принцип Dependency Inversion обращает внимание на то, как зависимости между классами могут быть организованы для улучшения гибкости, переиспользуемости и тестируемости кода.

Принцип состоит из двух ключевых аспектов:

  • Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций.
  • Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

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

У чому різниця між GET та POST запитом?

GET-запрос:

  • Используется для получения данных с сервера.
  • Параметры запроса (например, данные для поиска или фильтрации) обычно передаются через URL в виде строки запроса.
  • Ограничение на длину URL в разных браузерах может повлиять на возможность передачи больших объемов данных.
  • GET-запросы могут быть закешированы браузером.
  • Они могут быть сохранены в истории браузера.
  • Они могут быть подвержены атакам CSRF (межсайтовая подделка запроса).

POST-запрос:

  • Используется для отправки данных на сервер.
  • Параметры запроса передаются в теле запроса, что позволяет передавать большие объемы данных.
  • POST-запросы не кэшируются браузером.
  • Они не сохраняются в истории браузера.
  • POST-запросы более безопасны в контексте атак CSRF, так как они могут быть защищены механизмами вроде токенов.

Когда использовать GET:

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

Когда использовать POST:

  • Отправка данных на сервер (например, отправка формы).
  • Запросы, которые изменяют состояние сервера (создание, обновление или удаление данных).
  • Отправка больших объемов данных.
  • Когда безопасность и защита от CSRF атак важны.

У чому різниця дзвінка self і static?

В PHP, как и в некоторых других языках программирования, self и static - это два ключевых слова, используемых в контексте классов для работы с методами и свойствами классов. Они имеют некоторые различия в поведении, особенно касающиеся наследования и контекста вызова. Давайте рассмотрим их отличия:

self:

  • self используется для обращения к статическим методам и свойствам внутри самого класса, в котором оно определено.
  • self ссылается на текущий класс, в котором это ключевое слово используется.
  • self не учитывает переопределения методов и свойств в подклассах. Всегда будет обращаться к методам и свойствам, определенным в текущем классе.
class ParentClass {
    public static $var = 10;
    public static function printVar() {
        echo self::$var;
    }
}

class ChildClass extends ParentClass { public static $var = 20; }

ChildClass::printVar(); // Выведет: 10

static:

  • static также используется для обращения к статическим методам и свойствам, но оно учитывает контекст вызова.
  • Если метод или свойство переопределены в подклассе, то static будет ссылаться на класс, в контексте которого был вызван метод, а не на класс, где оно определено.
class ParentClass {
    public static $var = 10;
    public static function printVar() {
        echo static::$var;
    }
}

class ChildClass extends ParentClass { public static $var = 20; }

ChildClass::printVar(); // Выведет: 20

В этом примере static учитывает переопределение переменной $var в подклассе ChildClass и ссылается на переменную, определенную в контексте вызова, то есть в подклассе.

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

Яка різниця між MVP та MVC?

MVP (Model-View-Presenter) и MVC (Model-View-Controller) - это две различные архитектурные парадигмы, используемые в разработке программного обеспечения для структурирования пользовательского интерфейса и управления данными. Они имеют общие концепции, но с некоторыми отличиями в организации и взаимодействии компонентов.

MVC (Model-View-Controller):

Модель (Model): Это представление данных и бизнес-логики. Модель обрабатывает данные, валидацию и выполнение бизнес-операций. Представление (View): Отображает данные пользователю и обрабатывает пользовательский ввод. Оно отвечает за визуальное представление данных. Контроллер (Controller): Обрабатывает пользовательский ввод, решает, какой функциональности следует вызвать на основе этого ввода, и обновляет модель и представление.

MVP (Model-View-Presenter):

Модель (Model): Аналогично MVC, это слой данных и бизнес-логики. Представление (View): Отвечает за отображение данных и обработку пользовательского ввода, но оно пассивнее по сравнению с представлением в MVC. В MVP представление знает о презентере, но не наоборот. Презентер (Presenter): Презентер обрабатывает пользовательский ввод, обновляет модель и обновляет представление. Он играет активную роль и содержит логику, которая в MVC была разнесена между контроллером и представлением.

Сравнение:

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

Яка різниця між == та ===?

В случае === сравнение значений идёт с учётом типа данных.

Що таке final class та final method?

В языках программирования, которые поддерживают объектно-ориентированную парадигму (такие как Java, PHP, C#), ключевое слово final используется для указания, что определенный элемент (класс, метод или свойство) не может быть изменен или наследован.

Final class (финальный класс):

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

final class MyFinalClass {
    // Код класса
}
// Ошибка! Нельзя создать подкласс от MyFinalClass
class Subclass extends MyFinalClass {
}

Final method (финальный метод):

Когда метод объявлен с ключевым словом final, это означает, что этот метод не может быть переопределен в подклассе. Метод, объявленный как final, должен иметь тот же доступ (public, protected, private), что и метод в родительском классе.

class ParentClass {
    final public function myFinalMethod() {
        // Код метода
    }
}

class ChildClass extends ParentClass { // Ошибка! Нельзя переопределить метод myFinalMethod public function myFinalMethod() { // Код метода в подклассе } }

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

Якими фреймворками працювали?

LARAVEL. Очень хорошо разбираюсь в UIKIT.

Що можете розповісти про свої навички, що дають вам перевагу? Які з них відповідають нашим вимогам?

  • Умение анализировать сложные задачи и разрабатывать эффективные алгоритмы для их решения.
  • Знание HTML, CSS и JavaScript, а также фреймворков и различных библиотек.
  • Навыки в создании скриптов и автоматизации задач.
  • Знание SQL и опыт работы с различными базами данных (MySQL, MSSQL, Oracle), опыт работы с Eloquent ORM.
  • Опыт работы с big data (таблицы с более 1 млн записей).
  • Опыт командной работы, использование систем контроля версий (Git).
  • Опыт работы c Opencart и Joomla(+Joomshopping) CMS различных версий.
  • Опыт работы c заказчиком и исполнителем (полное сопровождение АСУ финансово-экономической деятельности предприятия), высшее образование по специальности "управление проектами".

Releases

No releases published

Packages

No packages published

Languages