2016-07-31 31 views
8

Về Laravel, tôi có câu hỏi về tính năng tự động tải Composer, tức là sự khác biệt giữa tự động tải "psr-4" và "classmap".Sự khác biệt giữa PSR-4 và tự động tải lớp bản đồ?

1 sự khác biệt mà tôi biết là PSR-4 không cần lặp đi lặp lại dumpautoload cho mỗi thay đổi hoặc bổ sung các tập tin mới trong khi classmap cần dumpautoload cho mọi sự thay đổi trong các tập tin hiện có chứa các lớp học hoặc bổ sung các tập tin mới trong thư mục chỉ định.

Trả lời

21

Tiêu chuẩn PSR-4 yêu cầu bạn cấu trúc hệ thống tệp nghiêm ngặt dựa trên không gian tên. Giả sử bạn có một ứng dụng trong thư mục src với không gian tên App, thì tất cả các không gian tên phụ sẽ phản ánh các thư mục con và tên lớp sẽ giống với tên tệp mà không cần tiện ích mở rộng .php.

{ 
    "autoload": { 
     "psr-4": { "App\\": "src/" } 
    } 
} 

src/ 
    Foo/ 
     Bar.php <---- App\Foo\Bar class 
    Baz.php <---- App\Baz class 

Trình tự động sau đó "biết" nơi tìm kiếm tên của một tên đủ điều kiện nhất định và do đó không yêu cầu lệnh tự động tải để đánh hơi tệp cho lớp học.

Các vấn đề về hiệu suất sau đó được giải quyết với cờ composer dump-autoload --optimize-autoloader hoặc -o, sẽ tạo bản đồ lớp giống như cách tự động tải lớp bản đồ.


Mặt khác, classmap tự động load không yêu cầu bạn phải có hầu như bất kỳ tập tin nào đó hoặc cấu trúc thư mục, nó sẽ đệ quy đi qua .php.inc tập tin trong thư mục và các tập tin định và sniff cho các lớp học trong đó .

{ 
    "autoload": { 
     "classmap": ["src/", "lib/", "Something.php"] 
    } 
} 

Các lớp này sau đó được thêm vào danh sách (được lưu trong tệp PHP trong thư mục nhà cung cấp/nhà soạn nhạc) được sử dụng để tự động tải.

Bất kỳ lớp mới nào cũng phải được thêm vào danh sách đó bằng cách chạy lệnh composer dump-autoload.

+0

điều gì về các tệp php thuần túy không có lớp học? ví dụ. chỉ cần một tập tin php với một loạt các chức năng toàn cầu, làm thế nào để thêm vào đó? – Toskan

+1

@Toskan xem https://getcomposer.org/doc/04-schema.md#files – Finwe

Các vấn đề liên quan