PHP | Вопросы собесов
2.44K subscribers
31 photos
1 video
1K links
Download Telegram
🤔 Что такое списочный тип?

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

🚩Особенности

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

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

🟠Гетерогенность
В списке могут храниться элементы различных типов данных (например, числа, строки, объекты).

🚩Примеры списочных типов в различных языках программирования

Python
  my_list = [1, 2, 3, 'a', 'b', 'c']
my_list.append(4) # Добавление элемента
print(my_list[2]) # Доступ к элементу по индексу (вывод: 3)


Java
  import java.util.ArrayList;

ArrayList<Object> myList = new ArrayList<>();
myList.add(1);
myList.add("hello");
System.out.println(myList.get(1)); // Доступ к элементу по индексу (вывод: hello)


PHP
  $myList = array(1, 2, 3, 'a', 'b', 'c');
array_push($myList, 4); // Добавление элемента
echo $myList[2]; // Доступ к элементу по индексу (вывод: 3)


🚩Плюсы

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

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

Active Record нарушает принцип единственной ответственности (SRP) из SOLID.
1. В Active Record бизнес-логика и операции работы с базой данных объединены в одном классе.
2. Это усложняет поддержку, тестирование и расширение кода.


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

Это метод оптимизации памяти, используемый для увеличения эффективности. Когда несколько процессов или потоки обращаются к одному и тому же ресурсу (например, области памяти), создаётся одна копия ресурса, которая используется совместно до момента изменения. Если процесс хочет изменить ресурс, создаётся его собственная копия, чтобы сохранить изоляцию изменений. Пример: массив передаётся функции. Пока он не изменяется, память общая. При изменении создаётся отдельная копия массива. Применяется в PHP для управления объектами, массивами и значениями, особенно после версии PHP 5.

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

1. Base64: для передачи бинарных данных в текстовом формате.
2. URL Encoding: преобразование специальных символов в безопасный формат для URL.
3. ASCII и Unicode: для кодировки символов.
4. JSON и XML: для структурирования данных.
5. UTF-8: стандарт кодировки текста.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔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;


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

• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.


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

Пространства имён (namespace) в PHP используются для разделения кода и предотвращения конфликтов имён классов, функций и констант.

🚩Почему нужны `namespace`?

Избегают конфликтов имён (если два разных файла объявляют одинаковые классы).
Упрощают организацию кода (структура похожа на файловую систему).
Работают с автозагрузкой (PSR-4) – Composer использует namespace для загрузки файлов.

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

Без пространства имён – конфликт классов
// Файл: models/User.php
class User {
public function getRole() {
return "Пользователь";
}
}

// Файл: controllers/User.php
class User {
public function getRole() {
return "Администратор";
}
}

// Ошибка! PHP не знает, какой User использовать.
$user = new User();


С namespace – классы разделены
// Файл: models/User.php
namespace App\Models;

class User {
public function getRole() {
return "Пользователь";
}
}

// Файл: controllers/User.php
namespace App\Controllers;

class User {
public function getRole() {
return "Администратор";
}
}

// Используем классы с указанием namespace
$modelUser = new App\Models\User();
echo $modelUser->getRole(); // "Пользователь"

$controllerUser = new App\Controllers\User();
echo $controllerUser->getRole(); // "Администратор"


🟠Импорт (`use`) – сокращает длинные пути
Вместо длинных App\Models\User, можно импортировать
use App\Models\User;

$user = new User(); // PHP понимает, что это App\Models\User


🟠Работа с функциями и константами
Пространства имён работают не только с классами, но и с функциями и константами.
namespace Utils;

function hello() {
return "Привет!";
}

echo hello(); // "Привет!"
echo \Utils\hello(); // "Привет!" (полный путь)


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

ACID — это акроним, обозначающий четыре ключевых свойства транзакций в базах данных: Atomicity (атомарность), Consistency (согласованность), Isolation (изоляция), Durability (устойчивость). Эти свойства гарантируют надежное выполнение транзакций.?

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

JOIN – это операция в SQL, которая позволяет объединять данные из двух или более таблиц на основе общего поля.

В SQL есть 5 основных видов JOIN

🟠`INNER JOIN`
пересечение двух таблиц (только совпадающие записи).
🟠`LEFT JOIN`
все записи из левой таблицы + совпадения из правой.
🟠`RIGHT JOIN`
все записи из правой таблицы + совпадения из левой.
🟠`FULL JOIN`
объединяет все записи из обеих таблиц.
🟠`CROSS JOIN`
декартово произведение (каждая строка первой таблицы соединяется с каждой строкой второй).

🚩`INNER JOIN` – только совпадения

Возвращает только те строки, у которых есть совпадения в обеих таблицах.
SELECT users.id, users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;


🚩`LEFT JOIN` – все из левой таблицы + совпадения

Возвращает все записи из левой таблицы, а если в правой нет совпадения – подставляет NULL.
SELECT users.id, users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;


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

Бэкслеш (\) используется для обращения к глобальным функциям или классам, чтобы избежать их переопределения в текущем пространстве имён.
Например, \strlen() вызовет глобальную функцию strlen, а не её версию из текущего namespace.


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

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

🚩Зачем нужно функциональное программирование?

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

🚩Принципы функционального программирования

Чистые функции (Pure Functions)
Иммутабельность (Immutable Data)
Функции высшего порядка (Higher-Order Functions)
Функциональные композиции
Отсутствие побочных эффектов

🟠Чистые функции
Это функция, которая:
Возвращает один и тот же результат для одинаковых аргументов.
Не изменяет внешние переменные и не имеет побочных эффектов.
$total = 0;
function addToTotal($num) {
global $total;
$total += $num;
return $total;
}


Пример чистой функции
function add($a, $b) {
return $a + $b;
}
echo add(3, 4); // 7


🟠Иммутабельность
В FP данные не изменяются – вместо изменения переменных создаются новые.
$arr = [1, 2, 3];
$arr[] = 4; // Изменяет массив


Пример иммутабельности
$arr = [1, 2, 3];
$newArr = array_merge($arr, [4]); // Создает новый массив


🟠Функции высшего порядка
Это функции, которые:
Принимают другие функции в качестве аргументов.
Возвращают другие функции.
function applyFunction($func, $value) {
return $func($value);
}

$square = function ($x) {
return $x * $x;
};

echo applyFunction($square, 5); // 25


🟠Функциональные композиции
Вместо длинных процедур можно сочетать функции.
function double($x) {
return $x * 2;
}

function increment($x) {
return $x + 1;
}

function compose($f, $g) {
return function ($x) use ($f, $g) {
return $f($g($x));
};
}

$doubleThenIncrement = compose('increment', 'double');

echo $doubleThenIncrement(3); // (3 * 2) + 1 = 7


🟠Отсутствие побочных эффектов
Функции не должны изменять внешние данные (например, глобальные переменные, файлы, БД).
function logMessage($message) {
file_put_contents("log.txt", $message, FILE_APPEND);
}


Функция без побочных эффектов:
function formatMessage($message) {
return strtoupper($message);
}
echo formatMessage("hello"); // HELLO


🚩Функциональное программирование в PHP

PHP – это не чисто функциональный язык, но поддерживает FP-стиль:
array_map() – применяет функцию ко всем элементам массива.
array_filter() – фильтрует массив по функции.
array_reduce() – сворачивает массив в одно значение.
$numbers = [1, 2, 3, 4, 5];

// Умножаем каждый элемент на 2
$doubled = array_map(fn($x) => $x * 2, $numbers);
print_r($doubled); // [2, 4, 6, 8, 10]

// Фильтруем только четные числа
$evens = array_filter($numbers, fn($x) => $x % 2 === 0);
print_r($evens); // [2, 4]

// Суммируем все числа
$sum = array_reduce($numbers, fn($carry, $x) => $carry + $x, 0);
echo $sum; // 15


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

Это структура данных, оптимизирующая поиск текстовой информации в базе данных.
1. Используется для эффективного поиска по словам или фразам в текстовых полях.
2. Применяется в MySQL, PostgreSQL, ElasticSearch и других системах.


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

С 1 по 5 декабря конференция Podlodka PHP Crew собирает сезон о том, как разгонять PHP-разработку без стресса и перегрузов.

📌 В программу вошли новые доклады:

🧩 Тесты для ускорения — Александр Макаров (Twindo): о роли тестирования в скорости разработки, какие виды тестов действительно дают ускорение, и как распределить ответственность между разработчиками, QA и LLM.

📄 Контракты пишем — код генерим — Александр Забанов (Вебпрактик): contract-first подход, который снижает количество ошибок и делает интеграции предсказуемыми.

🧱 Платформа как LEGO — Антон Комарев (BelkaCar): как собрать внутреннюю платформу для разработчиков из готовых «кубиков» и убрать хаос внутренних тулов.

🎛 Фича-флаги — Сергей Волошин (Вебпрактик): как перейти от «деплой = релиз» к гибкому управлению функциональностью и выпускать код хоть каждый час.

💡Все темы прикладные, с упором на ускорение команд и уменьшение рутины.

🔗 Программа и билеты: https://podlodka.io/phpcrew
Когда проекты растут, а требований становится больше, скорость разработки начинает упираться не в язык или фреймворки, а в процессы, инструменты и организацию работы.

С 1 по 5 декабря конференция Podlodka PHP Crew собирает сезон о том, как разгонять PHP-разработку без стресса и перегрузов.

📌 В программу вошли новые доклады:

🧩 Тесты для ускорения — Александр Макаров (Twindo): о роли тестирования в скорости разработки, какие виды тестов действительно дают ускорение, и как распределить ответственность между разработчиками, QA и LLM.

📄 Контракты пишем — код генерим — Александр Забанов (Вебпрактик): contract-first подход, который снижает количество ошибок и делает интеграции предсказуемыми.

🧱 Платформа как LEGO — Антон Комарев (BelkaCar): как собрать внутреннюю платформу для разработчиков из готовых «кубиков» и убрать хаос внутренних тулов.

🎛 Фича-флаги — Сергей Волошин (Вебпрактик): как перейти от «деплой = релиз» к гибкому управлению функциональностью и выпускать код хоть каждый час.

💡Все темы прикладные, с упором на ускорение команд и уменьшение рутины.

🔗 Программа и билеты: https://podlodka.io/phpcrew
👍1
🤔 Расскажи про букву D в SOLID и ее связь с интерфейсами?

Принцип Dependency Inversion (DIP) гласит:

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

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

🚩Как DIP связан с интерфейсами?

Плохой код (без инверсии зависимостей)
class MySQLDatabase {
public function connect() {
return "Подключение к MySQL";
}
}

class UserRepository {
private MySQLDatabase $db; // Жёсткая зависимость!

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


Хороший код (через интерфейс, следуя DIP)
interface DatabaseInterface {
public function connect();
}

class MySQLDatabase implements DatabaseInterface {
public function connect() {
return "Подключение к MySQL";
}
}

class PostgreSQLDatabase implements DatabaseInterface {
public function connect() {
return "Подключение к PostgreSQL";
}
}

class UserRepository {
private DatabaseInterface $db;

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

// Теперь можно подставить любую базу данных!
$mysqlRepo = new UserRepository(new MySQLDatabase());
$pgRepo = new UserRepository(new PostgreSQLDatabase());


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

1. Hash-индекс:
• Быстрый доступ для равенств (=) и точных запросов.
• Не подходит для диапазонных запросов.
2. B-Tree индекс:
• Оптимален для диапазонных запросов и сортировки.
• Поддерживает равенства и сравнения (<, >).
• Медленнее hash-индекса для точного поиска.


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

Использование JOIN в SQL может привести к нескольким проблемам, особенно при работе с большими таблицами. Рассмотрим основные из них.

🟠Производительность (нагрузка на БД)
Чем больше данных соединяется, тем больше ресурсов требуется.
Проблема: JOIN создаёт временную таблицу в памяти, что замедляет запрос. Если нет индексов, соединение идёт через полный перебор (Nested Loop Join), что очень медленно.
Решение:
Добавить индексы на поля, по которым идёт соединение.
Использовать EXPLAIN для анализа запроса.
EXPLAIN SELECT * FROM users JOIN orders ON users.id = orders.user_id;


🟠Дублирование строк (Картезианское произведение)
Если используется JOIN, но нет условия соединения (ON), запрос создаст все возможные комбинации строк.
Проблема:
SELECT * FROM users, orders;


Решение
Всегда указывать ON или USING:
SELECT * FROM users JOIN orders ON users.id = orders.user_id;


🟠Потеря данных при `INNER JOIN`
INNER JOIN возвращает только совпадающие строки, из-за чего можно потерять данные.
Проблема
SELECT users.id, users.name, orders.id AS order_id  
FROM users
INNER JOIN orders ON users.id = orders.user_id;


Решение: Использовать LEFT JOIN, если нужны все пользователи, даже без заказов:
SELECT users.id, users.name, orders.id AS order_id  
FROM users
LEFT JOIN orders ON users.id = orders.user_id;


🟠Медленный `JOIN` на `TEXT` или `VARCHAR`
JOIN по строковым полям (VARCHAR, TEXT) работает медленнее, чем по числовым (INT).
Проблема
SELECT * FROM users JOIN orders ON users.email = orders.email;


🟠Несовместимость типов данных
Если соединяются таблицы с разными типами данных (INT vs VARCHAR), может быть скрытое приведение типов, которое замедляет запрос.
Проблема
SELECT * FROM users  
JOIN orders ON users.id = orders.user_id;


Решение
- Убедиться, что типы данных совпадают (INT = INT).
- Привести к нужному типу:
SELECT * FROM users  
JOIN orders ON users.id = CAST(orders.user_id AS INT);


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

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


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