Hamzah Jamad

Blogger. Programmer. Technologist.

Memahami Composer Autoloading [ Bahagian 1/2 ]

      Composer ialah Pengurus Pergantungan (Dependency Manager) untuk PHP, ianya memudahkan kita untuk memuat turun sumber kod yang kita perlukan dari packagist*. Ini dapat menjimatkan masa, sebab kita tidak perlu menulis semua kod yang diperlukan dari asas dan tidak perlu mencari setiap bahagian yang diperlukan secara manual. Sebagai contoh, sekiranya kita memerlukan sesuatu fungsi untuk menjalankan ujian terhadap kod yang telah kita tulis, kita boleh menggunakan phpunit, kita cuma perlu menyatakan kepada composer yang kita perlukan sumber kod tersebut, dengan arahan composer require phpunit/phpunit. Seterusnya, composer akan memuat turun fail-fail lain yang diperlukan untuk memastikan sumber kod tersebut berfungsi dengan sempurna.

      Manakala Autoloading pula merupakan satu cara untuk menstrukturkan projek kita dengan lebih tersusun. Ianya juga membolehkan kita menggunakan kod-kod secara terus tanpa perlu meletakkan penyata require bagi setiap fail di dalam projek kita.


      Memahami kedua-dua konsep ini mungkin akan mengambil masa, tetapi sepertimana apabila menggunakan kerangka PHP yang ada ( Laravel misalnya ) , susunatur projek kita akan menjadi lebih tersusun dan kemas. Hal ini disebabkan kita mengambil kira amalan pengkodan yang baik, sekaligus memudahkan programmer lain bekerjasama dalam projek tersebut.

Tiga Cara Untuk Autoloading

Dengan menggunakan composer, di dalam fail composer.json, anda hanya perlu nyatakan bagaimana dan fail apa yang anda hendak diautoloadkan ke dalam projek. Terdapat 3 pilihan yang boleh dipilih untuk melakukan autoloading, bergantung dengan keperluan anda. Tiga pilihan tersebut ialah, Autoloading Berasaskan Fail , Autoloading Berasaskan Classmap, dan Autoloading Berasaskan PSR.

1.Autoloading Berasaskan Fail

Pertama sekali kita akan membuat satu contoh mudah, untuk memahami bagaimana kita boleh autoload sesuatu fail
  1. Dalam folder www anda, buat satu folder bernama aldemo, singkatan Autoloading Demo.
  2. Kemudian buat satu folder baru, namakannya sebagai files. Dalam folder tersebut, kita akan letak semua kod yang akan kita tulis.
  3. Buat satu fail baru, namakannya sebagai helpers.php . Di dalam fail tersebut tulis sebuah function. Anda boleh menggunakan kod dibawah sebagai contoh.
    // files\helpers.php
    <?php
    function jutsu ()
    {
      return 'Kagebunshin no jutsu.';
    }
  4. Kemudian kita hanya perlu membuat fail composer.json di dalam folder aldemo, di dalam fail tersebut, anda perlu menulis konfigurasi dibawah.
    // composer.json
    {
        "autoload": {
            "files": ["files/helpers.php"]
        }
    }

  5. Dengan menggunakan terminal, dan berada di dalam folder aldemo , jalankan arahan composer dump-autoload. Sebuah folder dengan nama vendor akan tercipta secara automatik.
  6. Seterusnya di dalam folder aldemo buat satu fail index.php . Di dalam fail tersebut, letak kod dibawah
    // index.php
    <?php
    echo jutsu();
  7. Sekarang buka browser dan pergi ke http://localhost/aldemo . Anda akan berdepan dengan error dibawah:
    Fatal error: Uncaught Error: Call to undefined function jutsu() in G:\Programs\laragon\www\aldemo\index.php:2 Stack trace: #0 {main} thrown in G:\Programs\laragon\www\aldemo\index.php on line 2
  8. Ini kerana kita perlu nyatakan dalam fail index.php yang kita perlukan fail autoload tersebut. Edit fail index.php dan letakkan kod dibawah.
    // index.php
    <?php
    require 'vendor/autoload.php';
    echo jutsu();
  9. Kemudian refresh semula halaman tersebut, anda akan nampak teknik ninja yang selalu Naruto gunakan. Kagebunshin no jutsu.
 Cara ini kadangkala saya gunakan di dalam Laravel untuk meletakkan custom function sebagai pembantu yang boleh digunakan dimana-mana sahaja.


2.Autoloading Berasaskan Classmap

Seterusnya kita akan lihat bagaimana caranya kita untuk buat classmap autoloading. Cara ini lebih mudah sebab kita tidak perlu untuk nyatakan setiap fail yang kita hendak masukkan ke dalam autoload, kita cuma perlu meletakkan direktori sahaja.

  1. Buat satu folder dengan nama classmap di dalam folder aldemo .
  2. Di dalam folder classmap , buat satu fail dengan nama CmAutoload.php . Di dalam fail tersebut kita akan tulis logic mudah. Anda boleh gunakan kod dibawah sebagai rujukan.
    // classmap\CmAutoload.php
    <?php
    class CmAutoload
    {
      public function classmap () {
         return 'Rasengannnnnnnnn! ';
      }
    }

    Anda mesti menggunakan Class! classmap hanya boleh dibuat menggunakan class sahaja, manakala dengan fail, anda boleh menggunakan function sahaja.
  3. Kemaskini fail index.php anda dan buat satu objek berdasarkan class yang kita tulis sebentar tadi.
    // index.php
    <?php
    require 'vendor/autoload.php';
    echo jutsu();

    echo "<br>";

    $cm = new Cmautoload;
    echo $cm->classmap();

  4. Kemaskini fail composer.json anda dengan menambah konfigurasi dibawah
    // composer.json
    {
        "autoload": {
            "files": ["files/helpers.php"],
            "classmap": ["classmap"]
        }
    }

    penamaan folder tersebut mungkin tidak berapa konvensional, tetapi buat masa rasanya itu sudah mencukupi.
  5. Seterusnya, jalankan semula arahan composer dump-autoload 
  6. Refresh semula halaman http://localhost/aldemo , anda sepatutnya dapat lihat teknik kedua yang selalu Naruto gunakan.  
Kedua-dua cara ini sangat mudah dibuat dan difahami kerana kita cuma perlu nyatakan di mana fail atau folder yang hendak diautoload. Manakala autoloading yang melibatkan PSR memerlukan kita memahami teknik namespacing dalam PHP. Namun bagi mengelakkan pos ini menjadi terlalu panjang, Autoloading berasaskan PSR akan saya tulis di pos seterusnya. Terima kasih kerana membaca.