composer namespace và autoload với psr 4

Mục đích bài viết: Bạn muốn sử dụng namespace va` psr4?

namspace là gì: khi lập trình với JAVA hoặc .NET, chúng ta muốn gom những class liên quan đế nhau vào một package hay namespace.

psr4 là gì http://www.php-fig.org/psr/psr-4/ – là chuẩn để autoload các classes từ đường dẫn chứa classes cần load tự động (autoload)

Vậy autoload là gì? Nhiều người trong chúng ta viết chương trình theo phương pháp hướng đối tượng (OOP) và cứ mỗi class lại viết một file cho nó (theo cách mà JAVA hay .NET tổ chức). Với mục đích như thế, thay vì cứ mỗi file chúng ta lại dùng lệnh include hay require bao gồm cả đường dẫn đến tên file.

Chúng ta muốn đơn giản và tiện lợi hơn như sau

okay, nếu chúng ta đã hiểu thế nào là psr-4, namspace, autoloader – vậy làm sao tôi có thể tự tạo một project áp dụng composer namespace và autoload theo psr4 (hoạc có thể psr0)

Giả sử bạn có cấu trúc thư mức như sau, Student.php là class chứa thông tin về một sinh viên, và chúng ta muốn đặt nó trong namespace là  Longka và trỏ nó đến thư mục src/

composer autoloader psr4 folder structure
composer autoloader psr4 folder structure

và trong file index.php bạn muốn sử dụng cú pháp sau

Để làm điều này, đầu tiên tạo composer.json
Bạn có thể tạo file này bằng cách chạy lệnh

Sau đó trả lời các câu hỏi, nó sẽ cho ra composer.json như sau
Sau đó các bạn add autoload va psr-4 hoặc psr-0
vd:

Sau đó chạy lệnh, composer dumpautoload, nó sẽ generate thư mục vendor nếu có thể require, ở đây chúng ta chỉ bàn về  namespace va autoload .
Composer sẽ generate một số filé để hỗ trợ việc load class theo namespace
Sau đó trong file index.php
bạn chỉ cần

sau đó

Tét thử nhé 😉

php index.php
php index.php

Nếu bạn muốn đào sâu hơn về cách mà composer handle autoload bạn có thể tham khảo các files sau:

 

Mở rộng bài viết một xíu: trong trường hợp trong 1 namespace bạn có rất nhiều Class (es). Ở file index.php bạn không muốn cứ mỗi lần new một object lại use một class, trong khi  đó những class này lại cũng thuộc 1 namespace. Trong JAVA thì bạn có thể sử dụng

Trong php thì sao nhỉ: http://stackoverflow.com/questions/7121682/php-how-to-import-all-classes-from-another-namespace

Tại sao nên dùng PSR-4 với composer nhỉ ? ( pear ?? PSR-0 ??)
http://www.php-fig.org/psr/psr-4/meta/

Demo code:
https://github.com/nguyentienlong/composer-tut1
Tham khảo:
http://www.php-fig.org/psr/psr-4/
https://getcomposer.org/apidoc/master/Composer/Autoload/ClassLoader.html
https://getcomposer.org/doc/01-basic-usage.md#autoloading

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.