PHP | Вопросы собесов – Telegram
PHP | Вопросы собесов
2.43K subscribers
30 photos
1.1K links
Download Telegram
🤔 По какому принципу будешь выбирать архитектуру?

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

🚩Принципы выбор

🟠Требования к проекту
Функциональные требования: Какие функции должно выполнять приложение?
Нефункциональные требования: Производительность, масштабируемость, надежность, безопасность и т.д.

🟠Объем и сложность проекта
Размер команды: Количество разработчиков, их опыт и навыки.
Сложность бизнес-логики: Насколько сложны процессы и операции, которые будет выполнять система.

🟠Масштабируемость и производительность
Нагрузка: Ожидаемое количество пользователей, объем данных и частота операций.
Горизонтальная и вертикальная масштабируемость: Возможность добавления новых серверов или улучшения существующих для обработки увеличивающейся нагрузки.

🟠Надежность и отказоустойчивость
Требования к доступности: Время безотказной работы и допустимые уровни простоя.
Механизмы резервирования и восстановления: Способы обеспечения бесперебойной работы при сбоях.

🟠Безопасность
Конфиденциальность данных: Как будет обеспечиваться защита данных от несанкционированного доступа.
Целостность данных: Меры для предотвращения и обнаружения изменений данных.

🟠Управляемость и поддержка
Обслуживаемость: Легкость управления, мониторинга и обновления системы.
Документирование: Наличие подробной документации для поддержки и развития.

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

🟠Стоимость и сроки
Бюджет: Стоимость разработки, развертывания и поддержки системы.
Временные ограничения: Сроки выполнения проекта и время на разработку.

🚩Примеры выбора

🟠Monolithic Architecture (Монолитная архитектура)
Небольшие или средние проекты с низкой сложностью.
Ограниченные требования к масштабируемости.
Ограниченные ресурсы и сроки разработки.
Простое веб-приложение для управления контентом (CMS), где все компоненты (база данных, интерфейс пользователя, логика приложения) развернуты на одном сервере.

🟠Microservices Architecture (Микросервисная архитектура)
Большие и сложные проекты с высокой нагрузкой.
Требуется высокая масштабируемость и отказоустойчивость.
Разделение разработки на независимые команды.
Электронная коммерция, где отдельные микросервисы управляют различными аспектами системы, такими как управление продуктами, корзина, платежи, учетные записи пользователей и т.д.

🟠Event-Driven Architecture (Событийно-ориентированная архитектура)
Системы, которые должны реагировать на события в реальном времени.
Высокая гибкость и адаптивность к изменяющимся условиям.
Финансовая торговая платформа, где события от биржи передаются и обрабатываются различными сервисами в реальном времени для выполнения сделок и анализа данных.

🟠Serverless Architecture (Безсерверная архитектура)
Приложения с переменной нагрузкой.
Минимизация операционных расходов и управление серверной инфраструктурой.

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

Это запись событий, ошибок и действий приложения в журнал для диагностики и анализа.
1. Логи помогают отслеживать выполнение кода, анализировать сбои и выявлять узкие места.
2. Используются различные уровни логов: INFO, DEBUG, ERROR.
3. Это важный инструмент для отладки, мониторинга и аудита системы.


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

Передача данных в PHP играет ключевую роль, потому что большинство веб-приложений работают с вводом и выводом данных.

🚩Основные способы передачи данных в PHP

🟠Передача данных через `GET` (в URL)
Когда использовать: когда данные не секретные и нужно поделиться ссылкой.
// URL: example.com/page.php?name=Alice&age=25
echo $_GET['name']; // Alice
echo $_GET['age']; // 25


🟠Передача данных через `POST` (скрыто, чаще через формы)
Когда использовать: если данные конфиденциальные или большие (файлы, формы).
if ($_SERVER["REQUEST_METHOD"] === "POST") {
echo $_POST['username'];
}


🟠Передача данных через `SESSION` (сохраняются между страницами)
Когда использовать: если нужно запомнить данные пользователя между запросами.
session_start();
$_SESSION['user'] = "Alice"; // Сохраняем данные

echo $_SESSION['user']; // Alice


🟠Передача данных через `COOKIE` (сохраняются в браузере)
Когда использовать: если данные должны храниться даже после закрытия браузера.
setcookie("user", "Alice", time() + 3600); // Кука на 1 час
echo $_COOKIE['user']; // Alice


🟠Передача данных в API (JSON, `php://input`)
Когда использовать: если PHP получает данные от другого сервиса (например, мобильного приложения или JavaScript).
$data = json_decode(file_get_contents("php://input"), true);
echo $data['name'];


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
🤔 Какую проблему решают фабрика и фабричный метод?

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

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

Это два основных транспортных протокола в интернете. Они имеют разные характеристики и используются для различных целей.

🚩Основные отличия

🟠Надежность
TCP: Обеспечивает надежную передачу данных. Он использует механизмы установления соединения, подтверждение получения (ACK), контроль потерь пакетов, повторную передачу потерянных пакетов и контроль потока. Это гарантирует, что данные будут доставлены корректно и в правильном порядке.
UDP: Не обеспечивает надежную передачу данных. Нет подтверждений получения, нет повторной передачи потерянных пакетов и нет контроля потока. Это делает передачу менее надежной, но более быстрой и с меньшими накладными расходами.

🟠Установление соединения
TCP: Перед началом передачи данных устанавливается соединение с помощью процедуры "трехстороннего рукопожатия" (three-way handshake). Это означает, что обе стороны сначала обмениваются сигналами SYN и ACK для установления соединения.
UDP: Не требует установления соединения. Пакеты (датаграммы) просто отправляются к получателю без предварительного установления соединения.

🟠Порядок доставки
TCP: Обеспечивает доставку данных в правильном порядке. Если пакеты приходят в неправильном порядке, TCP собирает их в правильном порядке перед передачей приложению.
UDP: Не гарантирует порядок доставки. Пакеты могут приходить в произвольном порядке, и приложение должно обрабатывать их соответствующим образом, если это необходимо.

🟠Пропускная способность и задержки
TCP: Из-за механизмов контроля потока и подтверждений имеет большие накладные расходы и, следовательно, может быть медленнее. Это особенно заметно на сетях с высокой задержкой или потерей пакетов.
UDP: Из-за отсутствия контроля потока и подтверждений имеет меньшие накладные расходы, что может привести к меньшим задержкам и большей пропускной способности. Подходит для приложений, где важна скорость, а не надежность.

🟠Применение
TCP: Используется для приложений, где важна надежность и порядок передачи данных, таких как веб-браузеры (HTTP/HTTPS), электронная почта (SMTP, IMAP, POP3), файловые передачи (FTP), удаленный доступ (SSH).
UDP: Используется для приложений, где важна скорость и где потеря некоторых пакетов не критична, таких как потоковое видео и аудио (VoIP, IPTV), онлайн-игры, службы доменных имен (DNS).

🚩Примеры использования

TCP
HTTP/HTTPS: Веб-серфинг
SMTP: Отправка электронной почты
IMAP/POP3: Получение электронной почты
FTP: Передача файлов
SSH: Безопасный удаленный доступ


UDP
DNS: Запросы доменных имен
VoIP: Передача голоса через IP
IPTV: Потоковое видео
Онлайн-игры: Быстрая передача данных игровой логики
NTP: Синхронизация времени


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

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

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

Хеш-таблица – это структура данных, которая хранит пары "ключ → значение" и использует хеш-функцию для быстрого поиска, добавления и удаления данных.

🚩Основная идея

Ключ обрабатывается хеш-функцией → превращается в числовой индекс.
По индексу данные хранятся в массиве.
Быстрое обращение к данным по ключу: O(1) в среднем.

🚩Как это работает?

🟠Хеширование ключа
Представим, что у нас есть ключ "apple", и мы храним для него значение 100.
Применяем хеш-функцию к "apple"
$hash = hash('md5', 'apple'); 
echo $hash; // 1f3870be274f6c49b3e31a0c6728957f


Это хеш – длинное число, но нам нужно индексировать данные, поэтому мы берем его остаток от деления на размер массива (mod):
$index = hexdec(substr($hash, 0, 8)) % 10; 
echo $index; // Например, 3


🟠Поиск элемента
Когда мы ищем apple, алгоритм:
Применяет ту же хеш-функцию, получает индекс 3
Ищет значение в ячейке 3
Таким образом, поиск данных по ключу происходит мгновенно – O(1).
Коллизия – это когда разные ключи дают один и тот же индекс.
Пример: "apple" и "banana" могут попасть в одну ячейку!
Решения:
Метод цепочек – внутри каждой ячейки храним список значений (например, массив или связанный список).
Открытая адресация – если ячейка занята, ищем следующую свободную.

🚩Хеш-таблица в PHP

В PHP массивы (array) работают как хеш-таблицы!
$hashTable = [];
$hashTable['apple'] = 100;
$hashTable['banana'] = 200;

echo $hashTable['apple']; // 100


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

Динамическая типизация позволяет переменной менять тип во время выполнения программы. Тип определяется автоматически на основе присвоенного значения.


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

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

🚩Зачем нужно абстрагирование

🟠Снижение сложности
Сокращает количество деталей, с которыми нужно работать, что облегчает понимание и работу с системой.

🟠Повышение читаемости кода
Упрощает код, делая его более читаемым и легким для поддержки.

🟠Повторное использование кода
Создаёт возможность повторного использования общих функций и логики.

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

🟠Гибкость и расширяемость
Облегчает добавление новых функциональностей без изменения существующего кода.

🚩Как используется абстрагирование

Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП).

🚩Пример абстракции с использованием классов и интерфейсов

🟠Интерфейс
Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
public function draw();
}


🟠Классы, реализующие интерфейс
Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
public function draw() {
echo "Drawing a circle";
}
}

class Square implements Shape {
public function draw() {
echo "Drawing a square";
}
}


Использование абстракции
function renderShape(Shape $shape) {
$shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square


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

Снижение сложности
Абстракция скрывает сложные детали реализации, облегчая работу с системой.
Улучшение читаемости
Код становится более понятным и структурированным.
Гибкость и расширяемость
Облегчает добавление новых функций и изменений.
Повторное использование
Позволяет использовать общий код в разных частях программы.
Избыточность
Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно.
Накладные расходы
Может потребоваться больше времени и усилий на создание абстракций и их поддержку.

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

Ключевое слово final в PHP используется для того, чтобы запретить наследование классов или переопределение методов в дочерних классах. Это помогает защитить важные части кода от изменения и сохранять логику в неприкосновенности. Final используется для обеспечения предсказуемости поведения в классах.

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

Бинарное дерево – это структура данных, где каждый узел имеет максимум 2 потомка:
Левый потомок содержит меньшие значения.
Правый потомок содержит большие значения.

🚩Как устроено бинарное дерево?

Каждый узел состоит из:
Значения (value) – данные в узле.
Ссылки на левый (left) и правый (right) потомки (или null, если потомка нет).

       8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13



🚩Основные операции с бинарным деревом

🟠Вставка нового элемента
Если дерево пустое → создаём корневой узел.
Сравниваем значение с корнем:
- Если меньше → идём налево.
- Если больше → идём направо.
Повторяем, пока не найдём свободное место.
       8
/ \
3 10
/ \
1 6
/ \
4 7
/
5 <-- новый элемент добавляется слева от 6


Код вставки в PHP
class Node {
public int $value;
public ?Node $left = null;
public ?Node $right = null;

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

class BinaryTree {
public ?Node $root = null;

public function insert(int $value) {
$this->root = $this->insertRec($this->root, $value);
}

private function insertRec(?Node $node, int $value): Node {
if ($node === null) return new Node($value);
if ($value < $node->value) $node->left = $this->insertRec($node->left, $value);
else $node->right = $this->insertRec($node->right, $value);
return $node;
}
}

$tree = new BinaryTree();
$tree->insert(8);
$tree->insert(3);
$tree->insert(10);
$tree->insert(6);
$tree->insert(14);


🟠Поиск элемента в дереве
Алгоритм:
Начинаем с корня.
Если value == корень → найдено.
Если value < корень → ищем влево.
Если value > корень → ищем вправо.

1. 6 < 8 → идём влево к 3.
2. 6 > 3 → идём вправо к 6.
3. Нашли!

public function search(?Node $node, int $value): ?Node {
if ($node === null || $node->value === $value) return $node;
return ($value < $node->value)
? $this->search($node->left, $value)
: $this->search($node->right, $value);
}

$foundNode = $tree->search($tree->root, 6);
echo $foundNode ? "Найдено: " . $foundNode->value : "Не найдено";


🟠Удаление элемента из дерева
Сложность:
1. Если узел – лист → просто удаляем.
2. Если у узла один потомок → заменяем его потомком.
3. Если два потомка → находим минимальный элемент в правом поддереве и заменяем им удаляемый узел.

Пример удаления 3 (у него есть два потомка 1 и 6):
1. Находим минимальный узел в правом поддереве → 4.
2. Заменяем 3 на 4.
       8
/ \
3 10
/ \
1 6
/ \
4 7


После удаления 3
       8
/ \
4 10
/ \
1 6
/ \
5 7


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

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


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

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

🚩Анонимные функции

Это функции без имени, которые часто используются для создания функций-замыканий. Замыкания позволяют функциям захватывать переменные из своей области видимости. Анонимные функции создаются с использованием ключевого слова function.
<?php
$sayHello = function($name) {
return "Привет, $name!";
};

echo $sayHello("Мир"); // Выведет: Привет, Мир!
?>


🚩Стрелочные функции

Были введены в PHP 7.4 и представляют собой более компактный способ создания анонимных функций. Они используют синтаксис fn и автоматически захватывают переменные из внешней области видимости по значению.
<?php
$factor = 10;

$multiply = fn($x) => $x * $factor;

echo $multiply(5); // Выведет: 50
?>


🚩Зачем это нужно?

🟠Удобство
Создание функций на месте без необходимости придумывать имена.
🟠Замыкания
Возможность захвата переменных из внешней области видимости.
🟠Читабельность кода
Стрелочные функции делают код более лаконичным и читаемым.

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

🟠Фильтрация и сортировка массивов
Часто используются в функциях вроде array_filter, array_map и usort.
🟠Колбэки
Передача функции в качестве аргумента в другие функции (например, для обработки событий).

<?php
$numbers = [1, 2, 3, 4, 5];

$squared = array_map(fn($n) => $n * $n, $numbers);

print_r($squared); // Выведет: Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
?>


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

Горизонтальное шардирование разделяет данные на отдельные шарды по строкам, распределяя их между несколькими серверами. Это позволяет увеличивать масштаб за счёт добавления новых серверов.


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

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

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

Сокрытие данных (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


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

Индексы в базах данных используются для ускорения операций поиска и сортировки данных. Они создаются на столбцах, по которым часто выполняются запросы, такие как `SELECT`, `WHERE` или `ORDER BY`. Индексы позволяют базе данных быстро находить нужные записи без необходимости сканировать всю таблицу. Однако индексы занимают дополнительное место и могут замедлять операции вставки и обновления данных, поэтому их следует использовать с осторожностью.

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

Автоматическая загрузка классов (Autoloading) — это механизм, который позволяет не подключать вручную файлы с классами с помощью require или include. Вместо этого PHP автоматически загружает нужный класс при его первом использовании.

🚩Как работает автозагрузка?

Без автозагрузки (ручное подключение)
require_once "Car.php";
require_once "Bike.php";

$car = new Car();
$bike = new Bike();


С автозагрузкой (PHP сам загружает классы)
spl_autoload_register(function ($class) {
require_once $class . ".php";
});

$car = new Car(); // PHP сам загрузит "Car.php"
$bike = new Bike(); // PHP сам загрузит "Bike.php"


🚩Современный способ – автозагрузка через Composer

Если проект использует Composer, можно настроить автозагрузку по стандарту PSR-4.

1⃣В composer.json добавляем:
"autoload": {
"psr-4": {
"App\\": "src/"
}
}


2⃣В папке src/ создаём классы, например
- src/Car.php
- src/Bike.php

3⃣Запускаем команду
composer dump-autoload


4⃣Теперь можно использовать классы без require:
require 'vendor/autoload.php';

use App\Car;
use App\Bike;

$car = new Car();
$bike = new Bike();


Ставь 👍 и забирай 📚 Базу знаний
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
🤔 Какие модификаторы видимости есть в РНР?

В PHP есть три основных модификатора видимости для свойств и методов классов: public, protected и private. Они определяют, какой код имеет доступ к этим свойствам и методам.

🟠`public` (публичный)
Свойства и методы, объявленные как public, доступны отовсюду - как изнутри класса, так и извне, а также из наследуемых классов.
class MyClass {
public $publicProperty = 'Public';

public function publicMethod() {
echo 'This is a public method';
}
}

$obj = new MyClass();
echo $obj->publicProperty; // Выведет: Public
$obj->publicMethod(); // Выведет: This is a public method


🟠`protected` (защищённый)
Свойства и методы, объявленные как protected, доступны только внутри класса и в классах-наследниках. Они недоступны для внешнего кода.
class MyClass {
protected $protectedProperty = 'Protected';

protected function protectedMethod() {
echo 'This is a protected method';
}
}

class ChildClass extends MyClass {
public function accessProtected() {
echo $this->protectedProperty; // Выведет: Protected
$this->protectedMethod(); // Выведет: This is a protected method
}
}

$obj = new ChildClass();
$obj->accessProtected();


🟠`private` (приватный)
Свойства и методы, объявленные как private, доступны только внутри самого класса. Они недоступны ни для внешнего кода, ни для классов-наследников.
class MyClass {
private $privateProperty = 'Private';

private function privateMethod() {
echo 'This is a private method';
}

public function accessPrivate() {
echo $this->privateProperty; // Выведет: Private
$this->privateMethod(); // Выведет: This is a private method
}
}

$obj = new MyClass();
$obj->accessPrivate();


🚩Зачем нужны модификаторы видимости

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

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

Это порождающий паттерн, создающий объекты без явного указания их класса.
1. Simple Factory: один метод создаёт разные объекты.
2. Factory Method: делегирует создание объектов подклассам.
3. Abstract Factory: создаёт семейства связанных объектов.


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

В PHP можно организовать обработку данных порциями разными способами, в зависимости от того, с чем именно мы работаем: с базой данных, файлами или массивами. Основные методы:
SQL-запрос с LIMIT и OFFSET
Чтение файла построчно (fgets(), SplFileObject)
Итерация по массиву с array_chunk()
Использование генераторов (yield)

🟠Постраничная выборка в SQL (`LIMIT` + `OFFSET`)
При работе с базой данных мы можем загружать данные порциями с помощью LIMIT и OFFSET
$limit = 10;  // Количество записей на страницу  
$offset = 0; // Смещение (номер страницы * $limit)

$sql = "SELECT * FROM users ORDER BY id LIMIT $limit OFFSET $offset";
$result = $pdo->query($sql)->fetchAll();


Альтернативный вариант – постраничная выборка без OFFSET
$last_id = 0;
$sql = "SELECT * FROM users WHERE id > $last_id ORDER BY id LIMIT $limit";


🟠Чтение файла порциями (`fgets()`, `SplFileObject`)
При работе с большими файлами можно читать их построчно, а не загружать в память целиком.fgets() – чтение построчно
$handle = fopen("large_file.txt", "r");
while (($line = fgets($handle)) !== false) {
echo $line;
}
fclose($handle);


SplFileObject – более удобный способ
$file = new SplFileObject("large_file.txt");
while (!$file->eof()) {
echo $file->fgets();
}


🟠Разделение массива на порции (`array_chunk()`)
Если у нас массив данных, можно разбить его на части
$data = range(1, 100);
$chunks = array_chunk($data, 10);

foreach ($chunks as $chunk) {
print_r($chunk); // Выведет массивы по 10 элементов
}


🟠Генераторы (`yield`) – ленивый способ
Генераторы позволяют возвращать элементы по одному, не загружая всё в память сразу.
function getData() {
for ($i = 1; $i <= 100; $i++) {
yield $i; // Возвращает по одному значению
}
}

foreach (getData() as $num) {
echo $num . "\n";
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM