จัดโครงสร้างโค้ดของคุณด้วยเนมสเปซแบบ PSR-4 และปล่อยให้ Composer โหลดคลาสและ dependency ให้คุณ
เปิดบทเรียนนี้ใน Kodokonเนมสเปซขจัดการชนกันของชื่อ: ไลบรารีสองตัวสามารถนิยามคลาส Client ของตัวเองได้โดยไม่ขัดแย้งกัน ธรรมเนียมสากลคือ ใช้คำนำหน้าของผู้จำหน่าย (App, Acme\Blog) แล้วตามด้วยเนมสเปซย่อยที่สะท้อนโครงสร้างต้นไม้ของโฟลเดอร์ use นำเข้าชื่อแบบเต็ม (fully qualified) มาไว้ในไฟล์ปัจจุบัน ส่วน as เปลี่ยนชื่อมันในกรณีที่กำกวม หนึ่งไฟล์ = หนึ่งคลาส = หนึ่งเนมสเปซ วินัยข้อนี้ไม่ใช่ความพิถีพิถันด้านสไตล์ แต่เป็นเงื่อนไขที่จำเป็นอย่างยิ่งของการโหลดอัตโนมัติ
<?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,
) {
}
}การโหลดอัตโนมัติจะโหลดไฟล์คลาสตามที่ต้องการ: ไม่ต้อง require ด้วยตนเองอีกต่อไป มาตรฐาน PSR-4 นิยามการจับคู่ไว้ว่า คำนำหน้าเนมสเปซจะเชื่อมโยงกับโฟลเดอร์ราก และเนมสเปซย่อยแต่ละตัวจะกลายเป็นโฟลเดอร์ย่อย App\Service\UserService จึงถูกแปลงเป็น src/Service/UserService.php เบื้องหลังนั้น ทุกอย่างอาศัย spl_autoload_register นี่คือการนำไปใช้ขั้นต่ำสุด ที่ควรค่าแก่การเข้าใจ แม้คุณจะไม่มีวันเขียนมันขึ้นใหม่เองก็ตาม:
<?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';Composer ทำให้ทั้งหมดนี้เป็นระบบอุตสาหกรรม: composer.json ประกาศ dependency และการจับคู่ PSR-4 ของคุณ โดยทั่วไปคือ "autoload": { "psr-4": { "App\\\\": "src/" } } จากนั้น composer install จะดาวน์โหลดแพ็กเกจลงใน vendor/ และสร้าง vendor/autoload.php ซึ่งเป็น require เพียงบรรทัดเดียวของทั้งแอปพลิเคชันของคุณ ข้อแตกต่างที่สำคัญคือ require สำหรับแพ็กเกจที่จำเป็นในการใช้งานจริง ส่วน require-dev สำหรับเครื่องมือ (การทดสอบ การวิเคราะห์แบบสถิต) ซึ่งจะถูกตัดออกจากการดีพลอยด้วย --no-dev
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\Blog\PostRepository อยู่ที่ใด หากคำนำหน้า App\ ชี้ไปที่ src/?composer require --dev มีไว้เพื่ออะไร?