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.

include ../path_to/ClassA.php
include ../path_to/ClassB.php
include ../path_to/ClassC.php
//...

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

use App\ClassA
use App\ClassB
use App\ClassC
//...

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/

[caption id=“attachment_285” align=“aligncenter” width=“239”]composer autoloader psr4 folder structure composer autoloader psr4 folder structure[/caption]

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

$student = new Longka\Student();

Để 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

composer init

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:

{
    "autoload"  : {
        "psr-4": {
            "Longka":  "src/"
        }
    }
}

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

require_once vendor/autoload.php

sau đó

$student = new Longka\Student();

Tét thử nhé ;)

php index.php

[caption id=“attachment_286” align=“aligncenter” width=“300”]php index.php php index.php[/caption]

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:

vendor/autoload.php

--> vendor/composer/autoload_real.php 
--> và các file vendor/composer/autoload*.php khác

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

import info.longka.*

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