PHP | Вопросы собесов – Telegram
PHP | Вопросы собесов
2.44K subscribers
30 photos
1.06K links
Download Telegram
🤔 Чем полезно пространство имен?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое strict mode?

Strict mode (Строгий режим) в PHP — это режим, который заставляет PHP строго проверять типы аргументов в функциях.

По умолчанию PHP автоматически преобразует типы (например, "10" превращается в 10), но в строгом режиме такая конвертация запрещена — если тип не совпадает, будет ошибка.

🚩Как включить strict mode?

Строгий режим включается в начале PHP-файла с помощью:
declare(strict_types=1);


🚩Пример работы strict mode

Без строгого режима (PHP сам меняет типы)
function sum(int $a, int $b) {
return $a + $b;
}

echo sum("5", 10); // 15 (PHP сам превратит "5" в 5)


Со strict mode (жёсткая проверка типов)
declare(strict_types=1);

function sum(int $a, int $b) {
return $a + $b;
}

echo sum("5", 10); // ФАТАЛЬНАЯ ОШИБКА!


🚩Зачем нужен strict mode?

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Расскажи про полиморфизм

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое SOLID?

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

🟠S: Принцип единственной ответственности (Single Responsibility Principle)
Каждый класс должен иметь только одну причину для изменения. Этот принцип подчеркивает, что класс должен заниматься только одной задачей или иметь одну область ответственности.

🟠O: Принцип открытости/закрытости (Open/Closed Principle)
Сущности программы должны быть открыты для расширения, но закрыты для модификации. Это означает, что можно добавлять новые функциональности без изменения существующего кода.

🟠L: Принцип подстановки Барбары Лисков (Liskov Substitution Principle)
Объекты в программе можно заменять их наследниками без изменения свойств программы. Это предполагает, что объекты подклассов должны действовать так же, как объекты суперкласса, от которых они произошли.

🟠I: Принцип разделения интерфейса (Interface Segregation Principle)
Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип говорит о том, что лучше иметь много специализированных интерфейсов, чем один универсальный.

🟠D: Принцип инверсии зависимостей (Dependency Inversion Principle)
Модули высокого уровня не должны зависеть от модулей низкого уровня. Обе категории должны зависеть от абстракций. Кроме того, абстракции не должны зависеть от деталей; детали должны зависеть от абстракций. Это способствует ослаблению связности компонентов системы.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем разница кэширования, кодирования, шифрования?

1. Кэширование:
- Сохранение данных для быстрого повторного доступа, уменьшая время загрузки и нагрузку на сервер.
- Пример: сохранение веб-страницы в браузере.
2. Кодирование:
- Преобразование данных в другой формат для удобства передачи или совместимости.
- Пример: Base64 для передачи бинарных данных через текстовые протоколы.
3. Шифрование:
- Защита данных с использованием ключей, чтобы их мог прочитать только авторизованный получатель.
- Пример: AES или RSA для передачи конфиденциальной информации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что делают self и static?

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

🚩self

Используется для обращения к собственным методам и свойствам класса. Оно не учитывает наследование и всегда ссылается на тот класс, в котором написано.
class A {
public static function who() {
echo "Я класс A\n";
}

public static function call() {
self::who(); // Вызываем метод who() внутри того же класса
}
}

class B extends A {
public static function who() {
echo "Я класс B\n";
}
}

B::call(); // Выведет: "Я класс A", а не "Я класс B"


🚩static

Работает динамически, учитывает класс, из которого вызван метод. Это полезно в наследовании.
class A {
public static function who() {
echo "Я класс A\n";
}

public static function call() {
static::who(); // Используем static вместо self
}
}

class B extends A {
public static function who() {
echo "Я класс B\n";
}
}

B::call(); // Выведет: "Я класс B"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое списочный тип?

Это структура данных, представляющая упорядоченный набор элементов, где каждый элемент связан с предыдущим и следующим.
1. Пример — связанный список (linked list), где каждый узел содержит значение и ссылку на следующий узел.
2. Такие типы обеспечивают удобное добавление и удаление элементов, но имеют медленный доступ по индексу (O(n)).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Почему магические методы называются магическими?

Магические методы в PHP называются так, потому что они автоматически вызываются в определённых ситуациях, без явного вызова в коде.

🚩Примеры магических методов и их "магия"

🟠`__construct()` – вызывается при создании объекта
Магия: вызывается автоматически, когда создаётся объект.
class User {
public function __construct() {
echo "Создан новый пользователь!";
}
}

$user = new User(); // Выведет "Создан новый пользователь!"


🟠`__toString()` – вызывается при попытке вывести объект как строку
Магия: PHP сам вызывает этот метод, если echo или print пытаются вывести объект.
class Car {
public function __toString() {
return "Это машина!";
}
}

$car = new Car();
echo $car; // Выведет "Это машина!"


🟠`__get()` и `__set()` – перехватывают доступ к несуществующим свойствам
Магия: вызываются, если пытаемся получить или установить значение для несуществующего свойства.
class Person {
private array $data = [];

public function __get($name) {
return $this->data[$name] ?? "Нет такого свойства";
}

public function __set($name, $value) {
$this->data[$name] = $value;
}
}

$p = new Person();
$p->age = 30; // age не объявлен, но __set() сохранит его!
echo $p->age; // Выведет 30, хотя свойства age нет


🟠`__call()` – вызывается при вызове несуществующего метода
Магия: PHP автоматически вызывает __call(), если метод не найден.
class Robot {
public function __call($name, $arguments) {
return "Метод '$name' не существует!";
}
}

$r = new Robot();
echo $r->walk(); // Выведет "Метод 'walk' не существует!"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что известно про наследование?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 В чем преимущество hash индекс и btree индекс?

Hash-индексы и B-Tree-индексы являются двумя типами индексов, используемыми для ускорения операций поиска в базах данных. Оба типа имеют свои преимущества и недостатки в зависимости от конкретных сценариев использования.

🚩Hash-индексы

Быстрый доступ по точному совпадению
Hash-индексы обеспечивают очень быстрый доступ к данным при выполнении точных поисков (например, SELECT * FROM table WHERE column = 'value'). Время поиска практически константное (O(1)), что делает такие запросы очень эффективными.
Простота реализации
Hash-индексы просты в реализации и не требуют сложных структур данных для управления.

🚩B-Tree-индексы

Поддержка диапазонных запросов
B-Tree-индексы поддерживают операции поиска по диапазону и сортировку (например, BETWEEN, >, <, ORDER BY). Данные в B-Tree отсортированы, что делает такие запросы возможными и эффективными.

Сбалансированность
B-Tree автоматически поддерживает балансировку, что обеспечивает стабильную производительность для всех операций (поиск, вставка, удаление).

Универсальность
B-Tree-индексы поддерживают широкий спектр операций и типов данных, включая текстовые данные, даты и числа.

🟠Hash-индекс
Подходит для сценариев, где часто выполняются точные запросы равенства, например, поиск пользователя по уникальному идентификатору или email.
CREATE INDEX idx_email_hash ON users USING HASH (email);

SELECT * FROM users WHERE email = 'example@example.com';


🟠B-Tree-индекс
Подходит для сценариев, где часто выполняются диапазонные запросы, сортировка или комбинированные условия.
CREATE INDEX idx_name_btree ON users (name);

SELECT * FROM users WHERE name BETWEEN 'A' AND 'M';


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В чем отличие адаптера от декоратора

Адаптер и декоратор — это структурные паттерны проектирования, но они решают разные задачи. Адаптер используется для преобразования интерфейса одного класса в интерфейс, который ожидает клиент, чтобы классы с несовместимыми интерфейсами могли работать вместе. Декоратор, наоборот, добавляет новую функциональность к объекту, не изменяя его структуру, позволяя динамически изменять поведение объекта.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Что такое инкапсуляция?

Инкапсуляция — это один из основных принципов ООП. Она представляет собой механизм, позволяющий скрыть внутренние детали объекта и предоставлять доступ к данным и методам объекта только через определенные интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта.

🚩Основные аспекты

🟠Сокрытие данных
Инкапсуляция позволяет скрыть внутреннее состояние объекта от внешнего мира. Данные объекта становятся доступными только через методы, предоставленные самим объектом.
🟠Контроль доступа
Внутренние данные и методы объекта могут быть объявлены как приватные (private) или защищенные (protected), что предотвращает их прямой доступ из кода вне объекта. Публичные методы (public) используются для взаимодействия с объектом.
🟠Целостность данных
Поскольку доступ к данным осуществляется через методы, можно контролировать и проверять изменения состояния объекта, что помогает поддерживать его целостность и корректность.

class User {
// Приватные свойства
private $name;
private $email;

// Конструктор для инициализации свойств
public function __construct($name, $email) {
$this->setName($name);
$this->setEmail($email);
}

// Публичный метод для получения имени
public function getName() {
return $this->name;
}

// Публичный метод для установки имени
public function setName($name) {
if (!empty($name)) {
$this->name = $name;
} else {
throw new Exception("Name cannot be empty");
}
}

// Публичный метод для получения email
public function getEmail() {
return $this->email;
}

// Публичный метод для установки email
public function setEmail($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
} else {
throw new Exception("Invalid email address");
}
}
}

// Создание объекта пользователя
$user = new User("John Doe", "john.doe@example.com");

// Получение и изменение данных через публичные методы
echo $user->getName(); // John Doe
$user->setEmail("new.email@example.com");
echo $user->getEmail(); // new.email@example.com

// Прямой доступ к приватным свойствам вызовет ошибку
// $user->name = "Jane"; // Ошибка


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое HTTP?

HTTP (HyperText Transfer Protocol) — это протокол передачи гипертекста, используемый для обмена данными между веб-браузером и сервером. HTTP определяет методы (GET, POST, DELETE и др.), которые управляют отправкой и получением данных через Интернет.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Зачем придумали анонимные классы?

Анонимные классы в PHP были введены в версии 7.0 и позволяют создавать одноразовые объекты без необходимости предварительного объявления класса. Они имеют несколько преимуществ и предназначены для решения ряда задач в программировании. Вот основные причины и случаи, для которых они были придуманы:

🚩Зачем придумали анонимные классы

🟠Упрощение кода
Анонимные классы позволяют создать класс на месте, в том же файле, где он используется, без необходимости его предварительного определения. Это упрощает и сокращает код, особенно для одноразовых задач.
$logger = new class {
public function log($message) {
echo $message;
}
};

$logger->log("Hello, World!"); // Выведет: Hello, World!


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

🟠Использование одноразовых объектов
Анонимные классы удобны, когда нужно создать объект для одноразового использования, например, в тестах, или для передачи в функции или методы.
function handleRequest($handler) {
$handler->process();
}

handleRequest(new class {
public function process() {
echo "Processing request";
}
}); // Выведет: Processing request


🟠Более гибкая реализация интерфейсов и абстрактных классов:
Анонимные классы могут реализовывать интерфейсы или наследовать от абстрактных классов, предоставляя быстрый способ создать конкретные реализации на месте.
interface Logger {
public function log($message);
}

$logger = new class implements Logger {
public function log($message) {
echo $message;
}
};

$logger->log("Logging message"); // Выведет: Logging message


🟠Улучшение тестирования
В юнит-тестах анонимные классы позволяют быстро создавать мок-объекты (mock objects) для тестирования без необходимости создавать отдельные классы для каждой тестовой ситуации.
class Service {
private $logger;

public function __construct($logger) {
$this->logger = $logger;
}

public function execute() {
$this->logger->log("Service executed");
}
}

$mockLogger = new class {
public function log($message) {
echo "Mock: " . $message;
}
};

$service = new Service($mockLogger);
$service->execute(); // Выведет: Mock: Service executed


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие типизации существуют?

1. Динамическая типизация: PHP автоматически определяет тип переменной на основе её значения.
2. Явная типизация: начиная с PHP 7, можно указывать типы аргументов и возвращаемых значений функций (int, string, array и т.д.).
3. Слабая типизация: PHP преобразует типы данных автоматически при необходимости.
4. Строгая типизация: включает строгую проверку типов через директиву declare.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔1
🤔 Что такое абстрактный класс?

Абстрактный класс — это класс в ООП, который не может быть инстанциирован напрямую, то есть нельзя создать объект абстрактного класса используя оператор new. Они предназначены для того, чтобы служить базой для других классов, которые должны реализовать определенные методы, заданные в нем. Обеспечение общего определения класса, которое может быть использовано в качестве основы для создания производных классов. Производные классы должны реализовать все абстрактные методы абстрактного родительского класса, но при этом они могут также иметь дополнительные методы и свойства или переопределять существующие.
abstract class Животное {
public function ест() {
echo "Это животное ест";
}

abstract public function издаетЗвук();
}

class Собака extends Животное {
public function издаетЗвук() {
echo "Гав";
}
}

// $животное = new Животное(); // Ошибка: нельзя инстанциировать абстрактный класс
$собака = new Собака();
$собака->ест(); // Вывод: Это животное ест
$собака->издаетЗвук(); // Вывод: Гав


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что из себя представляет http-запрос?

HTTP-запрос — это сообщение, которое клиент отправляет серверу для выполнения определённой операции, например получения данных (GET) или их отправки (POST). Запрос содержит метод, URL, заголовки и тело запроса (если необходимо). Ответ сервера включает статус выполнения, заголовки и данные (если применимо).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Для чего нужна рефлексия?

Рефлексия (Reflection) – это механизм анализа классов, методов, свойств и других структур во время выполнения. Она позволяет получать информацию о коде и даже изменять его динамически.

🚩Когда полезна рефлексия?

🟠Фреймворки и DI-контейнеры
- Используется для автоматического внедрения зависимостей (Dependency Injection, DI).
- Например, Laravel использует рефлексию в Container для автоматического создания объектов.
class Database {
public function connect() {
return "Подключение к базе данных";
}
}

class UserService {
private $db;

public function __construct(Database $db) {
$this->db = $db;
}

public function getUser() {
return "Пользователь найден";
}
}

function resolve($class) {
$reflector = new ReflectionClass($class);
$constructor = $reflector->getConstructor();

if (!$constructor) {
return new $class;
}

$params = $constructor->getParameters();
$dependencies = [];

foreach ($params as $param) {
$type = $param->getType();
if ($type) {
$dependencies[] = resolve($type->getName());
}
}

return $reflector->newInstanceArgs($dependencies);
}

$service = resolve(UserService::class);
echo $service->getUser(); // "Пользователь найден"


🟠Декораторы, аннотации и атрибуты
- В PHP 8 появились атрибуты (аннотации), и рефлексия помогает их читать.
- Используется в Symfony, Doctrine для работы с ORM.
#[Attribute]
class Route {
public function __construct(public string $path) {}
}

class Controller {
#[Route('/home')]
public function home() {
return "Домашняя страница";
}
}

$reflection = new ReflectionMethod(Controller::class, 'home');
$attributes = $reflection->getAttributes(Route::class);
$route = $attributes[0]->newInstance();

echo $route->path; // "/home"


🟠Автоматическая генерация документации
- Реально использовать для автоматического создания Swagger/OpenAPI.
- Можно извлекать PHPDoc-комментарии и на их основе генерировать документацию.
class Example {
/**
* Возвращает приветствие
* @return string
*/
public function sayHello() {
return "Привет!";
}
}

$reflection = new ReflectionMethod(Example::class, 'sayHello');
echo $reflection->getDocComment();


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔Что такое Service Locator?

Это паттерн проектирования, предоставляющий объект (локатор), который отвечает за предоставление зависимостей (сервисов) в приложении.
• Он хранит ссылки на зависимости и позволяет получить их по запросу.
• Недостаток: сложнее отслеживать зависимости и тестировать код, так как локатор создаёт скрытые связи.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Для чего нужен Синглтон паттерн?

🟠Контроль над созданием объекта
Иногда требуется, чтобы у определенного класса был только один экземпляр в течение жизненного цикла программы. Это может быть связано с тем, что данный объект использует значительные ресурсы или имеет состояние, которое должно быть уникальным.

🟠Глобальная точка доступа
Синглтон предоставляет простой способ доступа к объекту из любой точки программы. Это упрощает управление состоянием приложения, поскольку все части программы могут взаимодействовать с одним и тем же экземпляром объекта.

🚩Как используется?

1⃣Закрытие конструктора
Конструктор объявляется закрытым (private), чтобы предотвратить создание объекта напрямую через оператор new.
2⃣Закрытие клонирования
Метод клонирования (magic method __clone()) тоже объявляется закрытым, чтобы запретить клонирование объекта.
3⃣Закрытие десериализации
Метод десериализации (magic method __wakeup()) также объявляется закрытым, чтобы предотвратить восстановление объекта из строки.
4⃣Статический метод для получения экземпляра
Создается статический метод, который проверяет, существует ли уже экземпляр объекта. Если нет, то создается новый; если да, то возвращается существующий.

Пример
class Singleton {
// Статическое свойство для хранения единственного экземпляра
private static $instance;

// Закрытый конструктор для предотвращения создания объекта через new
private function __construct() {}

// Запрет клонирования объекта
private function __clone() {}

// Запрет десериализации объекта
private function __wakeup() {}

// Метод для получения единственного экземпляра
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}

// Пример метода
public function sayHello() {
echo "Hello, Singleton!";
}
}

// Использование синглтона
$singleton = Singleton::getInstance();
$singleton->sayHello(); // Выведет "Hello, Singleton!"


🟠Контролируемое создание
Конструктор закрыт, поэтому экземпляр можно создать только внутри класса через метод getInstance().
🟠Глобальная доступность
Поскольку метод getInstance() статический, он доступен в любом месте кода, что делает доступ к экземпляру глобальным.
🟠Один экземпляр
Проверка в методе getInstance() гарантирует, что будет создан только один экземпляр класса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое индекс?

Индекс в контексте баз данных — это структура данных, которая улучшает скорость операций поиска/выборки данных, но может замедлить добавление, удаление и обновление данных из-за необходимости поддерживать индекс в актуальном состоянии.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1