PHP | Вопросы собесов
2.32K subscribers
36 photos
1.51K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Как расшифровывается Rest?

REST расшифровывается как REpresentational State Transfer (Представленческая передача состояния). Это архитектурный стиль для создания сетевых приложений, который определяет набор ограничений и принципов для проектирования и взаимодействия с веб-службами.

🚩Основные принципы


🟠Клиент-серверная архитектура (Client-Server)
Клиент и сервер разделены. Клиенты запрашивают ресурсы, а серверы предоставляют их. Это разделение позволяет независимое развитие клиента и сервера.

🟠Отсутствие состояния (Stateless)
Каждое взаимодействие между клиентом и сервером не зависит от предыдущих взаимодействий. Вся необходимая информация для выполнения запроса должна быть включена в сам запрос.

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

🟠Единообразный интерфейс (Uniform Interface)
Определяет единообразный способ взаимодействия с ресурсами, независимо от конкретного клиента или сервера. Включает четыре подпринципа:
Идентификация ресурсов: Каждый ресурс имеет уникальный идентификатор (обычно URL).
Манипуляция ресурсами через представления: Клиенты взаимодействуют с ресурсами, используя их представления (например, JSON, XML).
Самоописываемые сообщения: Сообщения содержат всю необходимую информацию для обработки запроса или ответа.
Гипермедиа как движок приложения (HATEOAS): Клиенты получают информацию о доступных действиях через гиперссылки в ответах сервера.

🟠Слои (Layered System)
Архитектура может быть многослойной, где каждый слой имеет свои обязанности и скрывает сложность соседних слоев.

🟠Код по требованию (Code on Demand, необязательный)
Сервер может передавать исполняемый код клиенту для выполнения. Например, JavaScript для выполнения на стороне клиента.

🚩Пример REST

GET: Получить ресурс.
POST: Создать новый ресурс.
PUT: Обновить существующий ресурс.
DELETE: Удалить ресурс.

🚩Пример API


1⃣Получить список пользователей
GET /users


Ответ
      [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]


2⃣Получить пользователя по ID
GET /users/1


Ответ
      {"id": 1, "name": "Alice"}


3️⃣Создать нового пользователя
POST /users


Тело запроса
{"name": "Charlie"}


Ответ
{"id": 3, "name": "Charlie"}


4⃣Обновить информацию о пользователе
PUT /users/1   


Тело запроса
{"name": "Alice Smith"}


5⃣Удалить пользователя
DELETE /users/1


Ставь 👍 и забирай 📚 Базу знаний
👍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' не существует!"


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как сделать так, чтобы сессии не хранились в файле?

Для хранения сессий не в файлах в PHP, можно использовать другие механизмы хранения, такие как базы данных, кэш-сервисы (например, Redis или Memcached) или специализированные хранилища.

🚩Хранение сессий в базе данных

1⃣Создайте таблицу для хранения сессий:
CREATE TABLE sessions (
id VARCHAR(255) PRIMARY KEY,
data TEXT,
last_access TIMESTAMP
);


2⃣Создайте обработчики сессий:
Создайте класс для обработки сессий, реализующий интерфейс SessionHandlerInterface.
class DBSessionHandler implements SessionHandlerInterface {
private $pdo;

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

public function open($savePath, $sessionName) {
return true;
}

public function close() {
return true;
}

public function read($id) {
$stmt = $this->pdo->prepare("SELECT data FROM sessions WHERE id = :id");
$stmt->bindParam(':id', $id);
$stmt->execute();
$session = $stmt->fetch(PDO::FETCH_ASSOC);
return $session ? $session['data'] : '';
}

public function write($id, $data) {
$stmt = $this->pdo->prepare("REPLACE INTO sessions (id, data, last_access) VALUES (:id, :data, NOW())");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':data', $data);
return $stmt->execute();
}

public function destroy($id) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = :id");
$stmt->bindParam(':id', $id);
return $stmt->execute();
}

public function gc($maxlifetime) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < NOW() - INTERVAL :maxlifetime SECOND");
$stmt->bindParam(':maxlifetime', $maxlifetime, PDO::PARAM_INT);
return $stmt->execute();
}
}


3⃣Инициализация сессий:
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$handler = new DBSessionHandler($pdo);
session_set_save_handler($handler, true);
session_start();


🚩Хранение сессий в Redis

1⃣Установите расширение `phpredis`Для Ubuntu:
sudo apt-get install php-redis


2⃣Используйте Redis для хранения сессий:
Настройте PHP для использования Redis в качестве хранилища сессий, добавив настройки в файл php.ini или в коде.
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое SOLID?

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что содержит инкапсуляция кроме сокрытия данных?

1. Контроль доступа: использование модификаторов public, protected, private для ограничения доступа.
2. Инкапсуляция логики: методы класса предоставляют контролируемый интерфейс для работы с данными.
3. Сохранение целостности: защита данных от некорректных изменений извне.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что содержит инкапсуляция кроме сокрытия данных?

Инкапсуляция — это не только скрытие данных, но и ограничение доступа к внутренним деталям объекта + защита логики от внешнего вмешательства.

🚩Основные аспекты инкапсуляции

Сокрытие данных (private, protected).
Контроль доступа через геттеры и сеттеры.
Защита объекта от некорректных данных.
Чёткое API для работы с объектом.
Разделение ответственности внутри класса.

🟠Сокрытие данных (`private`, `protected`)
Скрываем внутренние переменные, чтобы их нельзя было изменить напрямую.
class User {
private string $password; // Прямой доступ запрещён

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

$user = new User("123456");
// echo $user->password; // ❌ Ошибка! Доступ запрещён


🟠Контроль доступа через геттеры и сеттеры
Предоставляем доступ к данным через методы (контролируем поведение).
class User {
private string $password;

public function __construct(string $password) {
$this->setPassword($password);
}

public function getPassword(): string {
return "Секретный пароль скрыт"; // Никогда не выдаём оригинал
}

public function setPassword(string $password) {
if (strlen($password) < 6) {
throw new Exception("Пароль слишком короткий!");
}
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
}

$user = new User("securePass");
// echo $user->password; // ❌ Ошибка! Доступ запрещён
echo $user->getPassword(); // ✅ "Секретный пароль скрыт"


🟠Защита объекта от некорректных данных
Инкапсуляция позволяет проверять данные перед их сохранением.
class Product {
private float $price;

public function setPrice(float $price) {
if ($price < 0) {
throw new Exception("Цена не может быть отрицательной!");
}
$this->price = $price;
}
}


🟠Чёткое API для работы с объектом
Инкапсуляция создаёт удобный интерфейс для работы с классом.
class Order {
private array $items = [];

public function addItem(string $item) {
$this->items[] = $item;
}

public function getItems(): array {
return $this->items;
}
}

$order = new Order();
$order->addItem("Телефон");
print_r($order->getItems()); // ✅ ["Телефон"]


🟠Разделение ответственности внутри класса
Инкапсуляция помогает отделить внутреннюю логику от интерфейса.
class BankAccount {
private float $balance = 0;

private function logTransaction(float $amount) {
echo "Транзакция: $amount\n";
}

public function deposit(float $amount) {
$this->balance += $amount;
$this->logTransaction($amount);
}

public function getBalance(): float {
return $this->balance;
}
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance(); // ✅ 100


Ставь 👍 и забирай 📚 Базу знаний
🤔 Для чего используется индексация и что это такое?

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

🚩Зачем нужна индексация?

Ускоряет поиск (SELECT) – база данных быстрее находит нужные строки.
Ускоряет сортировку (ORDER BY) – индексы помогают быстрее упорядочивать данные.
Оптимизирует соединения таблиц (JOIN).

Замедляют операции INSERT, UPDATE, DELETE (так как индекс тоже нужно обновлять).
Индексы занимают дополнительное место в памяти.

🚩Пример индекса в SQL

1⃣Создание индекса
CREATE INDEX idx_users_name ON users(name);


Теперь поиск по name будет быстрее
SELECT * FROM users WHERE name = 'Alice';


🚩Типы индексов

🟠Обычный (B-Tree) индекс
Основной вид индекса, который ускоряет поиск по WHERE.
CREATE INDEX idx_name ON users(name);


🟠UNIQUE-индекс
Гарантирует, что значения в колонке не будут повторяться.
CREATE UNIQUE INDEX idx_email ON users(email);


🟠FULLTEXT-индекс
Используется для быстрого поиска по тексту.
CREATE FULLTEXT INDEX idx_text ON articles(content);


🟠Composite (Составной) индекс
Индекс сразу на несколько колонок (например, name + age).
CREATE INDEX idx_name_age ON users(name, age);


Ставь 👍 и забирай 📚 Базу знаний
🤔1
🤔 В чем преимущества асинхронного шифрования?

1. Безопасность: открытый ключ можно свободно распространять, закрытый ключ остаётся приватным.
2. Удобство обмена: не требуется передавать секретный ключ для шифрования.
3. Поддержка цифровой подписи: позволяет проверять подлинность отправителя.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Для чего нужна рефлексия?

Рефлексия (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();


Ставь 👍 и забирай 📚 Базу знаний
🔥1
🤔 Что такое сервис локатор?

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

🚩Зачем нужен

🟠Упрощение управления зависимостями
Все зависимости находятся в одном месте, что упрощает их управление и замену.
🟠Гибкость
Легко менять конкретные реализации зависимостей без изменения клиентского кода.
🟠Централизация
Все зависимости зарегистрированы и управляются в одном месте.
🟠Улучшение тестирования
Легко подменять зависимости на моки для проведения тестов.

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

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

1⃣Создание интерфейсов сервисов
interface Logger {
public function log($message);
}

interface PaymentProcessor {
public function processPayment($amount);
}


2⃣Реализация сервисов
class FileLogger implements Logger {
public function log($message) {
echo "Logging message to a file: $message";
}
}

class StripePaymentProcessor implements PaymentProcessor {
public function processPayment($amount) {
echo "Processing payment of $amount through Stripe";
}
}


3⃣Реализация Service Locator
class ServiceLocator {
private $services = [];

public function register($serviceName, $service) {
$this->services[$serviceName] = $service;
}

public function get($serviceName) {
if (!isset($this->services[$serviceName])) {
throw new Exception("Service not found: " . $serviceName);
}
return $this->services[$serviceName];
}
}


4⃣Регистрация и использование сервисов
$serviceLocator = new ServiceLocator();

// Регистрация сервисов
$serviceLocator->register('logger', new FileLogger());
$serviceLocator->register('paymentProcessor', new StripePaymentProcessor());

// Использование сервисов
$logger = $serviceLocator->get('logger');
$logger->log("This is a log message."); // Вывод: Logging message to a file: This is a log message.

$paymentProcessor = $serviceLocator->get('paymentProcessor');
$paymentProcessor->processPayment(100); // Вывод: Processing payment of 100 through Stripe


🚩Плюсы и минусы

➕Централизация
Все зависимости хранятся и управляются в одном месте.
➕Гибкость
Легко изменять зависимости без изменения кода, который их использует.
➕Удобство тестирования
Легко подменять реальные зависимости на моки для тестирования.
➖Скрытые зависимости
Зависимости не видны явно в коде, что может усложнить понимание.
➖Сложность
Может привести к более сложной архитектуре, особенно в больших приложениях.

Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое поведение copy-on-write?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 В чем заключается обработка ошибок и исключений?

Обработка ошибок в PHP – это механизм, который помогает находить, интерпретировать и корректно реагировать на ошибки во время выполнения программы. Для этого в PHP используются два подхода:

Традиционные ошибки (error_reporting, set_error_handler)
*Исключения (try-catch, throw)

🟠Традиционная обработка ошибок
PHP изначально использовал механизм ошибок, которые делятся на несколько типов:
E_ERROR – фатальная ошибка, завершает выполнение скрипта.
E_WARNING – предупреждение, но скрипт продолжает выполняться.
E_NOTICE – уведомление о потенциальной проблеме.
echo $undefined_var; // E_NOTICE: Undefined variable


🚩Способы обработки ошибок

🟠error_reporting() – управление уровнем ошибок
Функция error_reporting() позволяет включать или выключать определённые типы ошибок.
error_reporting(E_ALL & ~E_NOTICE); // Показывать все ошибки, кроме E_NOTICE


🟠set_error_handler() – создание пользовательского обработчика ошибок
Можно задать свою функцию, которая будет реагировать на ошибки.
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "Ошибка [$errno]: $errstr в файле $errfile на строке $errline";
}
set_error_handler("myErrorHandler");

// Вызовем ошибку
echo 10 / 0; // Division by zero (E_WARNING)


🟠error_log() – запись ошибок в файл
Ошибки можно не выводить на экран, а записывать в файл.
error_log("Ошибка: что-то пошло не так!", 3, "errors.log");


🚩Исключения (`try-catch`)

С версии PHP 5 появился механизм исключений, который более удобен и структурирован. Исключения позволяют:
Перехватывать ошибки и управлять их обработкой.
Использовать вложенные блоки try-catch для детальной обработки.
Создавать собственные классы исключений.
try {
if (!file_exists("somefile.txt")) {
throw new Exception("Файл не найден");
}
} catch (Exception $e) {
echo "Ошибка: " . $e->getMessage();
}


🟠Классы исключений
PHP позволяет использовать предопределённый класс Exception, а также создавать свои.
class MyException extends Exception {}

try {
throw new MyException("Это моя ошибка");
} catch (MyException $e) {
echo "Поймано исключение: " . $e->getMessage();
}


🟠Блок `finally`
Используется для выполнения кода в любом случае – независимо от того, было исключение или нет.
try {
echo "Попытка выполнить код\n";
} catch (Exception $e) {
echo "Ошибка поймана\n";
} finally {
echo "Этот код выполнится в любом случае\n";
}


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое Entity?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Зачем нужны паттерны проектирования?

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

🚩Зачем они нужны


🟠Повторяемость и стандартность
Паттерны обеспечивают повторяемость решений для часто возникающих задач, что снижает вероятность ошибок и улучшает читабельность кода.
🟠Улучшение коммуникации
Использование общепринятых паттернов облегчает коммуникацию между разработчиками. Когда все понимают, что подразумевается под, например, «одиночкой» (singleton), это упрощает обсуждение архитектуры системы.
🟠Повышение качества кода
Паттерны проектирования способствуют созданию более структурированного, гибкого и поддерживаемого кода.
🟠Экономия времени и ресурсов
Паттерны позволяют не изобретать велосипед, а использовать проверенные решения, что ускоряет процесс разработки.

🚩Как они используются

Паттерны проектирования делятся на несколько категорий, каждая из которых решает определенный тип задач:
🟠Порождающие паттерны
Эти паттерны касаются создания объектов. Примеры: Singleton, Factory, Builder.
🟠Структурные паттерны
Эти паттерны касаются построения структуры больших объектов. Примеры: Adapter, Composite, Decorator.
🟠Поведенческие паттерны
Эти паттерны касаются взаимодействия и распределения обязанностей между объектами. Примеры: Observer, Strategy, Command.
class Singleton {
private static $instance;

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

public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}

public function someBusinessLogic() {
// Некоторая бизнес-логика
}
}

// Использование Singleton
$singleton = Singleton::getInstance();
$singleton->someBusinessLogic();


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Где мы делаем фильтрацию данных?

Фильтрацию данных в PHP можно делать в нескольких местах в зависимости от контекста. Основные области фильтрации:

🚩Фильтрация входных данных

Когда мы получаем данные от пользователя ($_GET, $_POST, $_REQUEST), важно очищать их от нежелательных значений.
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);


Фильтрация массива $_POST через filter_var_array()
$filters = [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => FILTER_VALIDATE_INT
];
$filteredData = filter_var_array($_POST, $filters);


🚩Фильтрация перед сохранением в базу данных

Перед вставкой в SQL важно удалять потенциально опасные символы, чтобы избежать SQL-инъекций.
$db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $db->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
':name' => htmlspecialchars($_POST['name']),
':email' => $_POST['email']
]);


🚩Фильтрация данных внутри кода

Если данные поступают из разных источников, мы можем использовать фильтрующие функции PHP:

Очистка строки от HTML
$cleanText = strip_tags("<h1>Hello</h1>"); // "Hello"


Удаление пробелов
$trimmed = trim("   example   "); // "example"


Приведение к числу
$number = filter_var("42abc", FILTER_SANITIZE_NUMBER_INT); // 42


🚩Фильтрация перед выводом (защита от XSS)

Перед выводом в браузер очищаем данные от HTML/JS-кода, чтобы злоумышленник не внедрил скрипты.
echo htmlspecialchars("<script>alert('Hacked!')</script>"); 
// Выведет: &lt;script&gt;alert('Hacked!')&lt;/script&gt;


Ставь 👍 и забирай 📚 Базу знаний
8👍2
🤔 Как устроен Git?

Это распределенная система контроля версий, работающая на основе графа коммитов и хранения изменений через хеши (SHA-1).
1. Объектная модель:
- Commit – снимок состояния проекта.
- Tree – каталог файлов в коммите.
- Blob – сами файлы (содержимое).
2. Система ссылок (HEAD, branches, tags).
3. Механизм staging (индексация изменений) перед коммитом.
4. Быстрая работа за счет хранения только изменений (deltas) и поддержки локального репозитория.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Что такое Cookies в PHP?

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

🚩Как работают Cookies?

Установка Cookie в PHP
setcookie("username", "Alice", time() + 3600, "/");


Чтение Cookie в PHP
echo $_COOKIE["username"]; // ✅ Alice


Удаление Cookie
setcookie("username", "", time() - 3600, "/");


🚩Где используются Cookies?

Авторизация (сохранение логина).
Запоминание настроек (тема, язык).
Корзина товаров (если нет сессий).
Отслеживание пользователей (Google Analytics, реклама).

🚩Ограничения и безопасность Cookies

Максимальный размер – 4KB (поэтому для больших данных лучше использовать SESSION).
Можно изменить в браузере (поэтому не храните пароли в куках!).
Уязвимость XSS → если сайт подвержен XSS-атакам, злоумышленник может украсть куки.
Защита Cookies
setcookie("secure_cookie", "value", time() + 3600, "/", "", true, true);


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Где можно столкнуться с динамической типизацией?

Динамическая типизация характерна для языков, таких как Python, JavaScript, PHP. Например, переменная может быть сначала числом, а затем строкой.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое Docker?

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

🚩Основные концепции

🟠Контейнеры
Контейнеры — это легковесные, автономные, исполняемые пакеты, которые включают в себя все необходимое для запуска приложения: код, библиотеки, зависимости и системные инструменты. Контейнеры изолированы друг от друга и от хоста, что обеспечивает консистентность работы приложения в различных средах.

🟠Образы (Images)
Образ Docker — это неизменяемый шаблон, из которого создаются контейнеры. Образы могут базироваться на других образах и содержат все необходимое для запуска приложения. Например, образ может содержать операционную систему, веб-сервер и само приложение.

🟠Dockerfile
Dockerfile — это текстовый файл с инструкциями по созданию Docker-образа. Он содержит последовательность команд, которые Docker выполняет для сборки образа.
          # Используем базовый образ
FROM php:8.0-apache

# Копируем локальные файлы в контейнер
COPY src/ /var/www/html/

# Устанавливаем зависимости
RUN docker-php-ext-install mysqli


🟠Docker Hub
Docker Hub — это облачный сервис для хранения и обмена Docker-образами. Он позволяет публиковать свои образы и загружать образы, созданные другими пользователями.

🚩Плюсы

➕Портативность

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

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

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

➕Быстрое развертывание
Контейнеры можно запускать и останавливать за считанные секунды, что ускоряет процессы разработки, тестирования и развертывания приложений.

Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Зачем придумали анонимные классы?

Анонимные классы в 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


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое SOLID?

SOLID — это набор из пяти принципов объектно-ориентированного проектирования, направленных на создание более устойчивого и поддерживаемого кода. Эти принципы включают: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (замещение Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Применение SOLID помогает избежать чрезмерной сложности и делает код более гибким. Эти принципы часто используются для улучшения архитектуры приложений.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний