Kodokon kodokon.com

เนมสเปซ การโหลดอัตโนมัติ และ Composer

จัดโครงสร้างโค้ดของคุณด้วยเนมสเปซแบบ PSR-4 และปล่อยให้ Composer โหลดคลาสและ dependency ให้คุณ

8 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

เนมสเปซขจัดการชนกันของชื่อ: ไลบรารีสองตัวสามารถนิยามคลาส Client ของตัวเองได้โดยไม่ขัดแย้งกัน ธรรมเนียมสากลคือ ใช้คำนำหน้าของผู้จำหน่าย (App, Acme\Blog) แล้วตามด้วยเนมสเปซย่อยที่สะท้อนโครงสร้างต้นไม้ของโฟลเดอร์ use นำเข้าชื่อแบบเต็ม (fully qualified) มาไว้ในไฟล์ปัจจุบัน ส่วน as เปลี่ยนชื่อมันในกรณีที่กำกวม หนึ่งไฟล์ = หนึ่งคลาส = หนึ่งเนมสเปซ วินัยข้อนี้ไม่ใช่ความพิถีพิถันด้านสไตล์ แต่เป็นเงื่อนไขที่จำเป็นอย่างยิ่งของการโหลดอัตโนมัติ

PHP
<?php

declare(strict_types=1);

namespace App\Service;

use App\Repository\UserRepository;
use Psr\Log\LoggerInterface as Logger;

final class UserService
{
    public function __construct(
        private UserRepository $users,
        private Logger $logger,
    ) {
    }
}
ไฟล์ src/Service/UserService.php: เนมสเปซ การนำเข้า ชื่อแทน

การโหลดอัตโนมัติจะโหลดไฟล์คลาสตามที่ต้องการ: ไม่ต้อง require ด้วยตนเองอีกต่อไป มาตรฐาน PSR-4 นิยามการจับคู่ไว้ว่า คำนำหน้าเนมสเปซจะเชื่อมโยงกับโฟลเดอร์ราก และเนมสเปซย่อยแต่ละตัวจะกลายเป็นโฟลเดอร์ย่อย App\Service\UserService จึงถูกแปลงเป็น src/Service/UserService.php เบื้องหลังนั้น ทุกอย่างอาศัย spl_autoload_register นี่คือการนำไปใช้ขั้นต่ำสุด ที่ควรค่าแก่การเข้าใจ แม้คุณจะไม่มีวันเขียนมันขึ้นใหม่เองก็ตาม:

PHP
<?php

declare(strict_types=1);

spl_autoload_register(function (string $class): void {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $path = $baseDir
        . str_replace('\\', '/', $relative)
        . '.php';

    if (is_file($path)) {
        require $path;
    }
});

echo 'Autoloader registered';
autoloader แบบ PSR-4 ที่ทำด้วยมือ: คำนำหน้า โฟลเดอร์ราก การแปลงเป็นเส้นทาง

Composer ทำให้ทั้งหมดนี้เป็นระบบอุตสาหกรรม: composer.json ประกาศ dependency และการจับคู่ PSR-4 ของคุณ โดยทั่วไปคือ "autoload": { "psr-4": { "App\\\\": "src/" } } จากนั้น composer install จะดาวน์โหลดแพ็กเกจลงใน vendor/ และสร้าง vendor/autoload.php ซึ่งเป็น require เพียงบรรทัดเดียวของทั้งแอปพลิเคชันของคุณ ข้อแตกต่างที่สำคัญคือ require สำหรับแพ็กเกจที่จำเป็นในการใช้งานจริง ส่วน require-dev สำหรับเครื่องมือ (การทดสอบ การวิเคราะห์แบบสถิต) ซึ่งจะถูกตัดออกจากการดีพลอยด้วย --no-dev

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
วงจรชีวิต: เริ่มต้น เพิ่ม dependency สร้าง autoloader ขึ้นใหม่

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. ตาม PSR-4 คลาส App\Blog\PostRepository อยู่ที่ใด หากคำนำหน้า App\ ชี้ไปที่ src/?
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. คุณควรรวม (include) ไฟล์ใดเพื่อใช้ประโยชน์จากการโหลดอัตโนมัติที่ Composer สร้างขึ้น?
    • composer.json
    • vendor/autoload.php
    • ไฟล์ autoload.php ที่ต้องสร้างขึ้นเองที่รากโปรเจกต์
  3. composer require --dev มีไว้เพื่ออะไร?
    • ติดตั้งแพ็กเกจสำหรับการพัฒนาเท่านั้น ซึ่งถูกตัดออกจากการดีพลอยด้วย --no-dev
    • ติดตั้งแพ็กเกจเวอร์ชันที่ไม่เสถียร
    • ติดตั้งแพ็กเกจแบบโกลบอลบนเครื่อง