Статья

📘 Глава 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

  • Позднее статическое связывание

PHP
Для ответа вы можете авторизоваться