📘 Глава 20. Пространства имён, базовые классы и архитектура проекта
Мы на важной стадии: теперь, когда ты знаешь основы ООП, пора перейти к структуризации проекта, используя пространства имён (namespaces), базовые классы, и правильную архитектуру.
📦 Что такое пространство имён (namespace)?
Пространство имён — это способ логически группировать классы, чтобы избежать конфликтов и упростить управление кодом.
Представь: у тебя есть два класса User
— один в админке, другой в API. Пространства имён решают эту проблему:
namespace App\Models;
class User {
// Модель пользователя
}
namespace App\Controllers;
class User {
// Контроллер пользователя
}
✅ Объявление и использование
Файл app/Models/User.php
:
namespace App\Models;
class User {
public function __construct() {
echo "Model User loaded.";
}
}
Файл app/Controllers/UserController.php
:
namespace App\Controllers;
use App\Models\User;
class UserController {
public function show() {
$user = new User();
}
}
🧭 Структура проекта (MVC)
Для структурированного проекта удобно использовать архитектуру MVC (Model-View-Controller):
project/
├── app/
│ ├── Controllers/
│ ├── Models/
│ └── Views/
├── public/
│ └── index.php
├── vendor/
└── composer.json
-
Controllers — логика обработки данных
-
Models — работа с базой
-
Views — отображение (HTML, шаблоны)
⚙️ Базовый контроллер
Создаём app/Core/Controller.php
:
namespace App\Core;
class Controller {
protected function view(string $view, array $data = []) {
extract($data);
include __DIR__ . "/../Views/$view.php";
}
}
Теперь любой контроллер будет наследовать этот:
namespace App\Controllers;
use App\Core\Controller;
class HomeController extends Controller {
public function index() {
$this->view("home", ['title' => 'Welcome']);
}
}
🛠 Базовая модель
app/Core/Model.php
:
namespace App\Core;
use PDO;
class Model {
protected PDO $db;
public function __construct() {
$this->db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "");
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
app/Models/User.php
:
namespace App\Models;
use App\Core\Model;
class User extends Model {
public function all(): array {
$stmt = $this->db->query("SELECT * FROM users");
return $stmt->fetchAll();
}
}
🪄 Автозагрузка через Composer
composer.json
:
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
Команда:
composer dump-autoload
В public/index.php
:
require_once __DIR__ . '/../vendor/autoload.php';
use App\Controllers\HomeController;
$controller = new HomeController();
$controller->index();
🧩 Подключение шаблона
app/Views/home.php
:
<!DOCTYPE html>
<html>
<head>
<title><?= $title ?></title>
</head>
<body>
<h1><?= $title ?></h1>
<p>This is the home page.</p>
</body>
</html>
✅ Что ты усвоил
-
Как работают
namespace
иuse
-
Как организовать MVC-структуру
-
Как создать базовые классы:
Controller
,Model
-
Как использовать автозагрузку через Composer
-
Как подключать шаблоны
⏭ В следующей главе:
-
Работа с статическими методами и свойствами
-
Финальные классы, абстрактные классы
-
Ключевое слово
self
иstatic
-
Позднее статическое связывание