5.07. Важные классы, интерфейсы
Важные классы, интерфейсы
SPL (Standard PHP Library):
- Iterator — интерфейс для итерации.
- ArrayAccess — позволяет обращаться к объекту как к массиву.
- Countable — реализует метод count().
DateTime:
$date = new DateTime();
echo $date->format('Y-m-d H:i:s');
Exceptions:
try {
throw new Exception("Ошибка!");
} catch (Exception $e) {
echo $e->getMessage();
}
Reflection – для анализа классов, методов и свойств во время выполнения:
$reflector = new ReflectionClass('User');
echo $reflector->getName();
SPL предоставляет готовые интерфейсы и классы для решения распространённых задач. Примеры:
- SplStack, SplQueue
- DirectoryIterator, RecursiveDirectoryIterator
- SplObserver, SplSubject (паттерн Наблюдатель).
Возможности PHP
| Функция | Описание |
|---|---|
| print_r() | Вывод информации о переменной (удобно для отладки) |
| var_dump() | Подробный вывод с типами и размерами |
| array_map(), array_filter() | Функциональные методы работы с массивами |
| json_encode(), json_decode() | Работа с JSON |
| file_get_contents(), file_put_contents() | Чтение/запись файлов |
| htmlspecialchars() | Экранирование HTML-символов (безопасность) |
Для валидации данных PHP предоставляет встроенный инструмент filter_var.
Пример:
$email = "test@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Email корректен";
}
Валидация URL:
$url = "https://example.com ";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL валиден";
}
Санитизация:
$input = "<script>alert(1)</script>";
$safe = filter_var($input, FILTER_SANITIZE_STRING);
echo $safe; // alert(1)
Работа с базой данных осуществляется через PDO (PHP Data Objects):
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '';
try {
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
} catch (PDOException $e) {
echo "Ошибка подключения: " . $e->getMessage();
}
Пример подготовленного запроса в БД:
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute([$name, $email]);
Аутентификация, к примеру, простая проверка логина/пароля:
session_start();
if ($_POST['login'] === 'admin' && $_POST['password'] === '123') {
$_SESSION['logged_in'] = true;
header("Location: dashboard.php");
exit;
} else {
echo "Неверный логин или пароль";
}
PHP синхронный язык, но есть способы запускать фоновые задачи. К примеру, через exec():
exec("php background-task.php > /dev/null 2>&1 &");
…а также с использованием брокеров сообщений, таких как RabbitMQ.
Composer – менеджер зависимостей для PHP, позволяющий устанавливать пакеты и автоматически подключать классы.
require 'vendor/autoload.php';
use App\Services\Logger;
$logger = new Logger();
$logger->log('Новое событие');
Namespace (пространство имён) позволяет организовать код и избежать конфликтов имён классов:
// src/Database/Connection.php
namespace App\Database;
class Connection {
public function connect() {
return "Подключение установлено";
}
}
Использование:
use App\Database\Connection;
$conn = new Connection();
echo $conn->connect();
Traits – механизм повторного использования кода в нескольких классах без множественного наследования. Пример:
trait Loggable {
public function log($message) {
echo "[LOG] $message\n";
}
}
class UserService {
use Loggable;
}
$userService = new UserService();
$userService->log("Пользователь вошёл");
Генераторы (yield) позволяют создавать итерируемые объекты без хранения всего набора данных в памяти:
function numbers() {
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}
foreach (numbers() as $num) {
echo "$num\n";
}
Отложенные вызовы позволяют гарантировать выполнение определённого кода даже при закрытии скрипта.
finally:
try {
throw new Exception("Ошибка!");
} catch (Exception $e) {
echo "Перехвачено\n";
} finally {
echo "Это выполнится всегда\n";
}
exit() / die():
if (!file_exists('data.txt')) {
exit("Файл не найден.");
}
register_shutdown_function():
function shutdown() {
echo "Завершение работы скрипта.\n";
}
register_shutdown_function('shutdown');
exit("Выход...\n"); // shutdown всё равно вызовется
Магические методы позволяют добавлять динамическое поведение классам.
__get и __set:
class User {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function __get($name) {
return $this->data[$name] ?? null;
}
}
$user = new User();
$user->name = "Алексей";
echo $user->name; // Алексей
__call:
class Math {
public function __call($method, $args) {
if (str_starts_with($method, 'calc')) {
return array_sum($args);
}
throw new \Exception("Метод $method не найден");
}
}
$math = new Math();
echo $math->calcTotal(2, 3, 5); // 10