PHP Object Oriented Programming পর্ব-১২: PHP OOP Class Autoloading

PHP OOP তে class autoloading বিষয়টা কি?

মূলত: আগে থেকেই কোনো class include না করে রেখেই class object তৈরী করা কালীন স্বয়ংক্রিয় ভাবে class load হওয়ার পদ্ধতিকে PHP তে class autoloading বলা হয়। অর্থাৎ, একজন PHP প্রোগ্রামার যেকোনো বড় Project Development কালীন একাধিক class library তৈরী করতে হয়। এবং Project Development এর সুবিধার্তে বিভিন্ন সময়ে ভিন্ন ভিন্ন class এর ভিন্ন ভিন্ন Object তৈরী করতে হয়। আর এর জন্য প্রত্যেকটি PHP class file কে include অথবা require function দিয়ে program বা code এর শুরুতে সংযুক্ত বা include করে রাখতে হয়, আর এতে একজন প্রোগ্রামার কে আগে থেকেই অনেক অপ্রয়োজনীয় class গুলো include করে রাখতে হয়, আর তাতে project এর performance সহ বিভিন্ন সমস্যা তৈরী হয়। আর এই সমস্যা সমাধানের জন্য PHP-5 থেকে class autoloading সুবিধা সংযুক্ত করা হয়েছে। class autoloading করার জন্য class এর নাম এবং class file এর নাম একই হতে হয়।

PHP OOP তে কিভাবে class autoload করা হয়?

PHP তে spl_autoload_register() function এর মাধ্যমে class autoload করা হয়। চলুন আরেকটু ভালো ভাবে ব্যাখ্যা করা যাক :

উদাহরণস্বরূপ, একটি Web Forum Application তৈরী করবেন, এবং Web Forum Application এর মধ্যে আপনি Member class এর জন্য Member.php নামে একটি ফাইল এবং topic class এর জন্য Topic.php নামে একটি ফাইল তৈরী করলেন। সাধারণত আপনি আপনার class file গুলো আপনার ওয়েব সার্ভারের কোনো folder এ রাখবেন ঠিক এইরকম।

classes/
 Member.php
 Topic.php

এখন আপনি যদি আপনার application এর জন্য Member class থেকে একটা object তৈরী করার দরকার হয় বা মনে করেন, তাহলে আপনাকে প্রথমে Member.php ক্লাস ফাইল অন্তর্ভুক্ত করতে হবে, তারপর object তৈরী করতে হবে ঠিক নিচের মত করে:

<?php
require_once( "classes/Member.php" );
$member = new Member();
?>

এখন একই page এ আপনি যদি আপনার application এর জন্য Topic class থেকে একটা object তৈরী করার দরকার হয় বা মনে করেন, তাহলে আপনাকে আবার Member.php class file এর মত Topic.php class file অন্তর্ভুক্ত করতে হবে, তারপর object তৈরী করতে হবে ঠিক নিচের মত করে:

<?php
require_once( "classes/Member.php" );
require_once( "classes/Topic.php" );
$member = new Member();
$member = new Topic();
?>

এখন যদি আমরা PHP Class Autoloading Feature টি ব্যবহার করি, তাহলে বার বার class file include করার প্রয়োজন পরবেনা, আর PHP class Autoloading Feature টি ব্যবহার করতে চাইলে আপনাকে প্রথমে একটি function তৈরী করতে হবে, ঠিক নিচের উদাহরণটির মত করে।

<?php
function loadClass($class_name) {
    include "Classes/$class_name.php";
}
?>

বিঃ দ্রঃ loadClass function এ include function এর মধ্যে class file পাথটি ঠিক আছে কিনা তা খেয়াল রাখবেন। পাথ ঠিক না থাকলে class autoload হবেনা।

বিঃ দ্রঃ function এর নাম loadClass হতে হবে এমন কোনো কথা নেই। আপনি যেকোনো নামই ব্যবহার করতে পারবেন।

এখন আমাদেরকে spl_autoload_register() function দিয়ে আমাদের loadClass() function কে autoload এর জন্য রেজিস্টার করে নিতে হবে। নিচের উদাহরণটি দেখুন :

<?php
function loadClass($class_name) {
    include "Classes/$class_name.php";
}
spl_autoload_register("loadClass");
?>

এবার আপনার কাজ শেষ , এখন যখনি আপনি যেকোনো class এর object তৈরী করবেন সাথে সাথে সেই class টি autoload হয়ে যাবে। নিচের উদাহরণটি দেখুন :

//File: class_autoload.php
<?php
function loadClass($class_name) {
    include "Classes/$class_name.php";
}
 
spl_autoload_register("loadClass");
 
new Member;
echo "<br>";
new Topic;
?>

বুঝার সুবিদার্থে আপনার Member.php এবং Topic.php File দুটিতে নিচের কোড গুলো লিখুন। তারপর class_autoload.php file টি execute করুন।

File: Member.php

<?php
class Member{
    public function __construct(){
        echo "Hello Member Class";
    }
}
?>

File:Topic.php

<?php
class Topic{
    public function __construct(){
        echo "Hello Topic Class";
    }
}
?>

Anonymous function দিয়ে class autoloading

spl_autoload_register() function এ আমরা কোনো function এর নাম ব্যবহারের পরিবর্তে Anonymous function ব্যবহার করতে পারি। নিচের উদাহরণ দেখুন :

<?php
spl_autoload_register(
        function ($className){
            include "Classes/$className.php";
        });
 
new Member;
echo "<br>";
new Topic;
?>


Class Autoloading এ exception handling এর ব্যবহার

অনেক সময় আমরা Object তৈরী করার সময় class এর নাম ভুল করে ফেলি, আর তাতে PHP engine আমাদের কিছু unexpected error দেখায় , এতে project security, Project Performance এ মারাত্মক সমস্যা সৃষ্টি করে, আর class Autoloading এর ক্ষেত্রে এই বিষয়টা আমরা খুব সহজে exception handling দিয়ে solve করতে পারি। নিচের উদাহরণটি দেখুন:

<?php
spl_autoload_register(function ($className){
     if (file_exists("classes/$className.php")) { 
          require_once "classes/$className.php"; 
      } 
      else{
    throw new Exception("Unable to load $className Class.");
    }
});
 
try {
    new Member;
    echo "<br>";
    new NotExist;
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}
 
?>

Result

Hello Member Class
Unable to load NotExist Class.

ব্যাখ্যা: লাইন নম্বর ১২ এ আমাদের classes folder এর মধ্যে Member class থাকায় কোনো error দেখায় নাই। কিন্তু ১৪ নম্বর লাইনের NotExist class টি না থাকায় আমাদের custom error দেখাচ্ছে।

Mulitple Autoloads

আমাদের প্রোগ্রামিং লাইফ এ class file এর নাম গুলো সব সময় একই রকম হবে তার কোনো বিশ্বাস নেই। এমন কি file গুলো সব সময় একই folder এ থাকবে তার ও কোনো নিশ্চয়তা নাই , এবং file extension গুলো এক রকম নাও হতে পারে , আর এর জন্য PHP SPL autoload এ আছে Multiple Autoload। চলুন একটা উদাহরণ দিয়ে দেখা যাক :

<?php
 
    /*** nullify any existing autoloads ***/
    spl_autoload_register(null, false);
 
    /*** specify extensions that may be loaded ***/
    spl_autoload_extensions('.php, .class.php, .lib.php');
 
    /*** class Loader ***/
    function classLoader($class)
    {
        $filename = strtolower($class) . '.class.php';
        $file ='classes/' . $filename;
        if (!file_exists($file))
        {
            return false;
        }
        include $file;
    }
 
    function libLoader($class)
    {
        $filename = strtolower($class) . '.lib.php';
        $file ='libs/' . $filename;
        if (!file_exists($file))
        {
            return false;
        }
        include $file;
    }
 
    /*** register the loader functions ***/
    spl_autoload_register('classLoader');
    spl_autoload_register('libLoader');
 
    /*** a new instance of norman ***/
    $norman = new norman;
 
    /*** make norman do some thing ***/
    $norman->do_something();

Interfaces Autoload

উপরের উদাহরণ গুলোতে আমরা দেখেছি কিভাবে class কে autoload করা যায়। তবে আপনি চাইলে interface কেও autoload করতে পারেন। নিচের উদাহরণটি দেখুন :

<?php
    /*
     * icontroller.class.php
     * interface to ensure all classes have an index method
     *
     */
    interface iController
    {
        public function index();
    }
?>
<?php
    /*** nullify any existing autoloads ***/
    spl_autoload_register(null, false);
 
    /*** specify extensions that may be loaded ***/
    spl_autoload_extensions('.php, .class.php');
 
    /*** class Loader ***/
    function classLoader($class)
    {
        $filename = strtolower($class) . '.class.php';
        $file ='classes/' . $filename;
        if (!file_exists($file))
        {
            return false;
        }
        include $file;
    }
 
    /*** register the loader functions ***/
    spl_autoload_register('classLoader');
 
    class blog implements iController
    {
        public function index()
        {
            echo 'hello from the index';
        }
    }
 
    /*** a new blog instance ***/
    $blog = new blog;
 
    /*** run the index method ***/
    $blog->index();
?>

Leave A Reply

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