Списочный тип данных, также известный как список, представляет собой структуру данных, которая хранит упорядоченные коллекции элементов. Списки позволяют хранить наборы элементов, доступ к которым можно получить по индексу. Они широко используются в программировании благодаря своей гибкости и удобству.
Элементы в списке хранятся в определенном порядке, и этот порядок сохраняется. Каждый элемент имеет индекс, по которому к нему можно обратиться.
Списки обычно являются изменяемыми структурами данных, что означает, что вы можете добавлять, удалять или изменять элементы после создания списка.
В списке могут храниться элементы различных типов данных (например, числа, строки, объекты).
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
1. В Active Record бизнес-логика и операции работы с базой данных объединены в одном классе.
2. Это усложняет поддержку, тестирование и расширение кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Это метод оптимизации памяти, используемый для увеличения эффективности. Когда несколько процессов или потоки обращаются к одному и тому же ресурсу (например, области памяти), создаётся одна копия ресурса, которая используется совместно до момента изменения. Если процесс хочет изменить ресурс, создаётся его собственная копия, чтобы сохранить изоляцию изменений. Пример: массив передаётся функции. Пока он не изменяется, память общая. При изменении создаётся отдельная копия массива. Применяется в PHP для управления объектами, массивами и значениями, особенно после версии PHP 5.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3💊3👍1
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Перед выводом в браузер очищаем данные от HTML/JS-кода, чтобы злоумышленник не внедрил скрипты.
echo htmlspecialchars("<noscript>alert('Hacked!')</noscript>");
// Выведет: <noscript>alert('Hacked!')</noscript>Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Пространства имён (
namespace) в PHP используются для разделения кода и предотвращения конфликтов имён классов, функций и констант. Избегают конфликтов имён (если два разных файла объявляют одинаковые классы).
Упрощают организацию кода (структура похожа на файловую систему).
Работают с автозагрузкой (PSR-4) – Composer использует
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(); // ✅ "Администратор"
Вместо длинных
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
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
JOIN – это операция в SQL, которая позволяет объединять данные из двух или более таблиц на основе общего поля. В SQL есть 5 основных видов
JOIN пересечение двух таблиц (только совпадающие записи).
все записи из левой таблицы + совпадения из правой.
все записи из правой таблицы + совпадения из левой.
объединяет все записи из обеих таблиц.
декартово произведение (каждая строка первой таблицы соединяется с каждой строкой второй).
Возвращает только те строки, у которых есть совпадения в обеих таблицах.
SELECT users.id, users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
Возвращает все записи из левой таблицы, а если в правой нет совпадения – подставляет
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"); // HELLOPHP – это не чисто функциональный язык, но поддерживает 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 по 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
Принцип Dependency Inversion (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
• Быстрый доступ для равенств (=) и точных запросов.
• Не подходит для диапазонных запросов.
2. B-Tree индекс:
• Оптимален для диапазонных запросов и сортировки.
• Поддерживает равенства и сравнения (<, >).
• Медленнее hash-индекса для точного поиска.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍2
Использование
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 возвращает только совпадающие строки, из-за чего можно потерять данные. Проблема
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 по строковым полям (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
Strict mode (Строгий режим) в PHP — это режим, который заставляет PHP строго проверять типы аргументов в функциях.
По умолчанию PHP автоматически преобразует типы (например,
"10" превращается в 10), но в строгом режиме такая конвертация запрещена — если тип не совпадает, будет ошибка. Строгий режим включается в начале PHP-файла с помощью:
declare(strict_types=1);
Без строгого режима (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); // ❌ ФАТАЛЬНАЯ ОШИБКА!
Позволяет избежать ошибок, связанных с автоматическим преобразованием типов.
Делает код более предсказуемым и надёжным.
Используется в крупных проектах, где важна строгая типизация.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Полиморфизм — это концепция ООП, которая позволяет объектам разных классов обрабатывать одинаковые сообщения или методы по-разному. Полиморфизм позволяет использовать общий интерфейс для взаимодействия с объектами разных типов, не зная их конкретный класс. Он облегчает расширение и поддержку кода, делая его более гибким и удобным для добавления новых классов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это акроним, представляющий пять основных принципов ООП и проектирования, предложенных Робертом Мартином. Эти принципы направлены на повышение гибкости, читаемости, и поддерживаемости кода, а также упрощение его тестирования и рефакторинга. Вот они:
Каждый класс должен иметь только одну причину для изменения. Этот принцип подчеркивает, что класс должен заниматься только одной задачей или иметь одну область ответственности.
Сущности программы должны быть открыты для расширения, но закрыты для модификации. Это означает, что можно добавлять новые функциональности без изменения существующего кода.
Объекты в программе можно заменять их наследниками без изменения свойств программы. Это предполагает, что объекты подклассов должны действовать так же, как объекты суперкласса, от которых они произошли.
Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип говорит о том, что лучше иметь много специализированных интерфейсов, чем один универсальный.
Модули высокого уровня не должны зависеть от модулей низкого уровня. Обе категории должны зависеть от абстракций. Кроме того, абстракции не должны зависеть от деталей; детали должны зависеть от абстракций. Это способствует ослаблению связности компонентов системы.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM