Передача данных в PHP играет ключевую роль, потому что большинство веб-приложений работают с вводом и выводом данных.
Когда использовать: когда данные не секретные и нужно поделиться ссылкой.
// URL: example.com/page.php?name=Alice&age=25
echo $_GET['name']; // Alice
echo $_GET['age']; // 25
Когда использовать: если данные конфиденциальные или большие (файлы, формы).
if ($_SERVER["REQUEST_METHOD"] === "POST") {
echo $_POST['username'];
}Когда использовать: если нужно запомнить данные пользователя между запросами.
session_start();
$_SESSION['user'] = "Alice"; // Сохраняем данные
echo $_SESSION['user']; // Alice
Когда использовать: если данные должны храниться даже после закрытия браузера.
setcookie("user", "Alice", time() + 3600); // Кука на 1 час
echo $_COOKIE['user']; // AliceКогда использовать: если 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: Обеспечивает надежную передачу данных. Он использует механизмы установления соединения, подтверждение получения (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
Хеш-таблица – это структура данных, которая хранит пары "ключ → значение" и использует хеш-функцию для быстрого поиска, добавления и удаления данных.
Ключ обрабатывается хеш-функцией → превращается в числовой индекс.
По индексу данные хранятся в массиве.
Быстрое обращение к данным по ключу:
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 массивы (
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
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
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 для работы с объектом.
Разделение ответственности внутри класса.
Скрываем внутренние переменные, чтобы их нельзя было изменить напрямую.
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;
}
}Инкапсуляция создаёт удобный интерфейс для работы с классом.
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
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
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, можно настроить автозагрузку по стандарту PSR-4.
composer.json добавляем:"autoload": {
"psr-4": {
"App\\": "src/"
}
}src/ создаём классы, например -
src/Car.php -
src/Bike.php composer dump-autoload
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
- Сохранение данных для быстрого повторного доступа, уменьшая время загрузки и нагрузку на сервер.
- Пример: сохранение веб-страницы в браузере.
2. Кодирование:
- Преобразование данных в другой формат для удобства передачи или совместимости.
- Пример: Base64 для передачи бинарных данных через текстовые протоколы.
3. Шифрование:
- Защита данных с использованием ключей, чтобы их мог прочитать только авторизованный получатель.
- Пример: AES или RSA для передачи конфиденциальной информации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В PHP есть три основных модификатора видимости для свойств и методов классов:
public, protected и private. Они определяют, какой код имеет доступ к этим свойствам и методам.Свойства и методы, объявленные как 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, доступны только внутри класса и в классах-наследниках. Они недоступны для внешнего кода.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, доступны только внутри самого класса. Они недоступны ни для внешнего кода, ни для классов-наследников.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) При работе с базой данных мы можем загружать данные порциями с помощью
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() – чтение построчно $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();
}Если у нас массив данных, можно разбить его на части
$data = range(1, 100);
$chunks = array_chunk($data, 10);
foreach ($chunks as $chunk) {
print_r($chunk); // Выведет массивы по 10 элементов
}
Генераторы позволяют возвращать элементы по одному, не загружая всё в память сразу.
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
Типы объединений: INNER JOIN (только совпадающие строки), LEFT JOIN (все строки из левой таблицы), RIGHT JOIN (все строки из правой таблицы), FULL JOIN (объединение всех строк обеих таблиц), CROSS JOIN (декартово произведение), SELF JOIN (объединение таблицы с самой собой).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Цель тестирования всегда заключается в том, чтобы выявить ошибки, дефекты и недостатки в программном обеспечении до того, как оно будет выпущено или внедрено. Тестирование помогает убедиться, что программа работает правильно, соответствует требованиям и ожиданиям пользователей, а также обеспечивает высокое качество и надежность продукта.
Найти и исправить ошибки, которые могли возникнуть в ходе разработки. Это помогает предотвратить сбои в работе программы.
Убедиться, что программное обеспечение соответствует заданным требованиям и спецификациям. Это включает проверку функциональности, производительности, безопасности и других аспектов.
Тестирование помогает улучшить общее качество программного обеспечения, делая его более стабильным, надежным и удобным в использовании.
Убедиться, что конечные пользователи получат продукт, который удовлетворяет их потребности и ожидания, обеспечивая тем самым положительный пользовательский опыт.
Проверка того, что каждый компонент системы работает в соответствии с требованиями.
Проверка аспектов, не связанных напрямую с функциональностью, таких как производительность, безопасность, удобство использования и т.д.
Тестирование отдельных компонентов или модулей кода.
Проверка взаимодействия между различными модулями или компонентами системы.
Полная проверка всей системы в целом.
Проверка системы на соответствие бизнес-требованиям и готовность к использованию конечными пользователями.
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase {
public function testAdd() {
$calc = new Calculator();
$this->assertEquals(4, $calc->add(2, 2));
$this->assertEquals(0, $calc->add(-1, 1));
}
}
class Calculator {
public function add($a, $b) {
return $a + $b;
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM