لود خودکار کلاس‌ها در PHP
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 9 دقیقه

لود خودکار کلاس‌ها در PHP

در این مقاله می‌خواهیم اصول اولیه لودینگ در PHP و نحوه لود خودکار کلاس‌ها به وسیله کامپوزر را مورد بحث قرار دهیم. همچنین توضیح خواهیم داد که چرا لود خودکار اهمیت دارد و نحوه استفاده از کامپوزر برای این کار را به صورت گام به گام به شما نشان می‌دهیم. در آخر هم به تفاوت بین انواع مختلف لود خودکار در کامپوزر خواهیم پرداخت.

چرا به Autoloading نیاز داریم؟

هنگام ایجاد برنامه‌های PHP ممکن است لازم باشد از کتابخانه‌های شخص ثالث استفاده کنید. همانطور که می‌دانید، اگر بخواهید از این کتابخانه‌ها در برنامه خود کمک بگیرید، باید آنها را با استفاده از عبارت require یا include در فایل منبع برنامه قرار دهید.

مادامی که در حال توسعه برنامه‌های کوچک هستید، استفاده از این عبارات کفایت می‌کند. اما هرچقدر که برنامه شما رشد کرده و بزرگتر می‌شود، لیست عبارات require و include طولانی‌تر می‌گردد که نگهداری آن‌ها کمی آزاردهنده و دشوار است. مشکل دیگر این روش آن است که شما کل کتابخانه‌ها را در برنامه خود بارگذاری می‌کنید، از جمله قسمت‌هایی که حتی قصد استفاده از آنها را هم ندارید. این باعث می‌شود حافظه برنامه شما سنگین‌تر شود.

برای غلبه بر این مشکل، راه حل ایده‌آل آن است که کلاس‌ها را تنها در مواقعی که واقعا مورد نیاز هستند بارگیری کنیم. در اینجاست که autoloading وارد عمل می‌شود. اساسا هنگامی که از کتابخانه‌ای در برنامه خود استفاده می‌کنید، لود خودکار بررسی می‌کند که آیا قبلا بارگیری شده است، در غیر این صورت کلاس مورد نیاز را در حافظه لود می‌کند. بنابراین کلاس در مکان مورد نیاز بارگذاری می‌شود - به این کار autoloading می‌گویند. هنگامی که از لود خودکار استفاده می‌کنید، نیازی نیست همه فایلهای کتابخانه را به صورت دستی وارد نمایید. شما فقط باید فایل autoloader را که حاوی منطق بارگذاری خودکار است وارد کنید و کلاس‌های لازم به صورت داینامیک گنجانده می‌شوند.

در ادامه به لود خودکار توسط کامپوزر نگاهی می‌اندازیم. اما ابتدا توضیح خواهیم داد که چگونه می‌توانید این کار را بدون استفاده از کامپوزر در PHP انجام دهید.

لود خودکار بدون استفاده از Composer

ممکن است تاکنون متوجه نشده باشید، اما امکان پیاده‌سازی این عملکرد در PHP بدون کامپوزر هم وجود دارد. تابع ()spl_autoload_register چیزی است که این امکان را فراهم می‌کند. چنین متدی به شما اجازه می‌دهد زمانی که PHP سعی دارد کلاس‌هایی را که هنوز لود نشده‌اند بارگذاری کند، توابعی را ثبت کنید که در صف لودینگ قرار می‌گیرند تا به طور متوالی فعال شوند.

بیایید مثال زیر را بررسی کنیم تا نحوه عملکرد آن را درک نماییم.

<?php

function custom_autoloader($class) {
  include 'lib/' . $class . '.php';

}
spl_autoload_register('custom_autoloader');

$objFooBar = new FooBar();

?>

در مثال بالا با استفاده از تابع ()spl_autoload_register، تابع ()custom_autoloader را به عنوان لود خودکار سفارشی خود ثبت کرده‌ایم. سپس هنگامی که سعی می‌کنید کلاس FooBar را نمونه‌سازی کنید ولی هنوز در دسترس نیست، PHP تمام توابع ثبت شده خودکار را به صورت متوالی اجرا می‌کند. و بعد تابع custom_autoloader فراخوانی می‌شود که شامل فایل کلاس مورد نیاز است و در نهایت شی نمونه‌سازی می‌گردد. برای این مثال، فرض می‌کنیم که کلاس FooBar در فایل lib/FooBar.php تعریف شده است.

بدون لود خودکار، باید از عبارت require یا include برای قرار دادن فایل کلاس FooBar استفاده کنید. پیاده‌سازی autoloader در مثال فوق بسیار ساده است، اما می‌توانید با ثبت چندین autoloader برای انواع مختلف کلاس بر این اساس کار کنید.

در عمل اغلب نمی‌خواهیم لود خودکار را خودمان بنویسیم. به همین دلیل است که از کامپوزر کمک می‌گیریم. در بخش بعدی نحوه استفاده از کامپوزر را برای لود خودکار در PHP مورد بحث قرار می‌دهیم.

نحوه عملکرد لود خودکار با Composer

ابتدا اگر می‌خواهید طبق مثال‌ها پیش بروید، مطمئن شوید که کامپوزر را روی سیستم خود نصب کرده‌اید. وقتی صحبت از لود خودکار با کامپوزر می‌شود، روش‌های مختلفی وجود دارد که می‌توانید یکی را از بین آن‌ها انتخاب کنید.

به طور خاص، کامپوزر چهار روش مختلف برای بارگیری خودکار فایل‌ها ارائه می‌دهد:

  • File Autoloading
  • Classmap Autoloading
  • PSR-0 Autoloading
  • PSR-4 Autoloading

طبق مستندات رسمی کامپوزر، روش PSR-4 توصیه می‌شود و ما در بخش بعدی به طور مفصل به آن خواهیم پرداخت. اما در اینجا به طور مختصر سه گزینه دیگر را مورد بررسی قرار می‌دهیم.

قبل از پرداختن به جزییات، بیایید به سرعت مراحلی که هنگام استفاده از لود خودکار با کامپوزر باید انجام شود را طی کنیم.

  • فایل composer.json را در روت پروژه یا کتابخانه خود تعریف نمایید. این باید شامل دستوراتی مطابق با نوع لود خودکارتان باشد.
  • دستور composer dump-autoload را اجرا کنید تا فایلهای لازمی که کامپوزر برای لود خودکار استفاده می‌کند، ایجاد شود.
  • عبارت require 'vendor/autoload.php' را در بالای فایلی که می‌خواهید از لود خودکار استفاده کند، قرار دهید.

لود خودکار: دستور files

File Autoloading مشابه include و require کار می‌کند که به شما امکان بارگیری کل فایل‌های منبع را می‌دهد. هر بار که برنامه شما اجرا می‌شود، همه فایلهای منبع که با دستور files ارجاع داده شده‌اند بارگیری می‌شوند. این برای بارگیری فایل‌های منبعی که از کلاس‌ها استفاده نمی‌کنند مفید است.

برای استفاده از این نوع لود خودکار، باید لیستی از فایلهای دستور files موجود در composer.json را آماده کنید، همانطور که در قطعه کد زیر نشان داده شده است.

{
    "autoload": {
        "files": ["lib/Foo.php", "lib/Bar.php"]
    }

}

بدین صورت می‌توانیم لیستی از فایل‌های موجود در دستور files را که می‌خواهیم با کامپوزر به صورت خودکار بارگیری شوند، ارائه دهیم. بعد از اینکه فایل composer.json را در روت پروژه خود با محتویات بالا ایجاد کردید، فقط باید دستور composer dump-autoload را اجرا کنید تا فایل‌های مورد نیاز autoloader ایجاد شوند که در دایرکتوری vendor قرار می‌گیرند. سرانجام باید عبارت require 'vendor/autoload.php' را در بالای فایلی که می‌خواهید لود خودکار را با کامپوزر انجام دهد، قرار دهید. همانطور که در قطعه کد زیر نشان داده شده است.

<?php

require 'vendor/autoload.php';

// code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file

?>

عبارت require 'vendor/autoload.php' اطمینان حاصل می‌کند که فایل‌های لازم به صورت داینامیک بارگیری می‌شوند.

لود خودکار: دستور classmap

Classmap Autoloading نسخه بهبود یافته File Autoloading است. شما فقط باید لیستی از دایرکتوری‌ها را ارائه دهید و بعد کامپوزر تمام فایل‌های آن را اسکن می‌کند. برای هر فایل، کامپوزر لیستی از کلاس‌هایی را که در آن فایل موجود است تهیه کرده و هر زمان که به یکی از آن کلاس‌ها نیاز باشد، فایل مربوطه را به صورت خودکار بارگیری می‌نماید.

بنابراین بیایید فایل composer.json را برای نمایش لود خودکار classmap بررسی کنیم.

{
    "autoload": {
        "classmap": ["lib"]
    }

}

دستور composer dump-autoload را اجرا نمایید تا کامپوزر فایلهای موجود در دایرکتوری lib را بخواند و نقشه‌ای از کلاس‌های قابل بارگیری خودکار را ایجاد کند.

لود خودکار: PSR-0

PSR-0 استانداردی است که توسط گروه PHP-FIG برای لود خودکار توصیه می‌شود. در این استاندارد برای تعریف کتابخانه‌های خود باید از namespaceها استفاده کنید. همچنین نام کلاس واجد شرایط باید ساختار \<Vendor Name>\(<Namespace>\)*<Class Name> را منعکس کند. از طرفی کلاس‌های شما هم باید در فایلهایی ذخیره شوند که از ساختار دایرکتوری مشابه namespaceها پیروی میکنند.

بیایید به فایل composer.json در زیر نگاهی بیندازیم.

{
    "autoload": {
        "psr-0": {
            "Tutsplus\\Library": "src"
        }
    }
}

در لود خودکار PSR-0 باید namespaceها را در دایرکتوری تنظیم کنید. در مثال بالا به کامپوزر می‌گوییم هر چیزی که با فضای نام Tutsplus\Library شروع می‌شود باید در دایرکتوری
src\Tutsplus\Library موجود باشد.

به عنوان مثال اگر می‌خواهید کلاس Foo را در دایرکتوری src\Tutsplus\Library تعریف کنید، باید فایل src\Tutsplus\Library\Foo.php را مانند قطعه کد زیر نشان دهید:

<?php

namespace Tutsplus\Library;
class Foo
{
    //...
}

?>

همانطور که مشاهده می‌کنید، این کلاس در فضای نام Tutsplus\Library تعریف شده است. همچنین نام فایل با نام کلاس مطابقت دارد. اما بیایید ببینیم چگونه می‌توان کلاس Foo را به صورت خودکار بارگیری کرد.

<?php

require 'vendor/autoload.php';
$objFoo = new Tutsplus\Library\Foo();

?>

کامپوزر کلاس Foo را از دایرکتوری src\Tutsplus\Library لود می‌کند.

بنابراین تا لینجا توضیح مختصری درباره لود خودکار file، classmap و PSR-0 در کامپوزر داشتیم. در بخش بعدی نحوه عملکرد لود خودکار PSR-4 را خواهیم دید.

نحوه عملکرد لود خودکار PSRO-4 با استفاده از Composer

در قسمت قبل، نحوه عملکرد لود خودکار PSR-0 را مورد بحث قرار دادیم. PSR-4 نیز مشابه PSR-0 است، زیرا شما باید از namespaceها استفاده کنید. اما نیازی نیست که ساختار دایرکتوری را با فضاهای نام به کار ببرید.

در لود خودکار PSR-0 می‌بایست فضاهای نام را به ساختار دایرکتوری نگاشت می‌کردید. همانطور که در قسمت قبل بحث کردیم، اگر می‌خواستید کلاس Tutsplus\Library\Foo را به صورت خودکار بارگیری کنید، باید در src\Tutsplus\Library\Foo.php قرار می‌گرفت. اما در لود خودکار PSR-4 می‌توانید ساختار دایرکتوری را کوتاه کنید که منجر به ساختار بسیار ساده‌تری در مقایسه با روش PSR-0 می‌شود.

اکنون مثال بالا را بازبینی می‌کنیم، ببینید آیا می‌توانید تفاوت‌ها را تشخیص دهید.

در اینجا ظاهر فایل composer.json با لود خودکار PSR-4 نشان داده شده است.

{
    "autoload": {
        "psr-4": {
            "Tutsplus\\Library\\": "src"
        }
    }

}

توجه به این نکته ضروری است که در انتهای فضاهای نام علامت بک اسلش اضافه کرده‌ایم. نگاشت فوق به کامپوزر می‌گوید هر چیزی که با فضای نام Tutsplus\Library شروع شود باید در دایرکتوری src موجود باشد. بنابراین نیازی به ایجاد دایرکتوری Tutsplus و Library ندارید. به عنوان مثال اگر کلاس Tutsplus\Library\Foo را درخواست کنید، کامپوزر سعی می‌کند فایل src\Foo.php را بارگیری کند.

درک این نکته ضروری است که کلاس Foo همچنان در فضای نام Tutsplus\Library تعریف شده است و دیگر لازم نیست دایرکتوری مجزایی ایجاد کنید که از فضاهای نام پشتیبانی کند. محتویات فایل src\Foo.php نیز همانند فایل src\Tutsplus\Library\Foo.php در قسمت قبل است.

همانطور که می‌بینید، PSR-4 منجر به ساختار دایرکتوری بسیار ساده‌تری می‌شود. زیرا می‌توانید همچنان که از فضاهای نام کامل استفاده می‌کنید، دایرکتوری‌های تو در تو را حذف نمایید.

PSR-4 به عنوان روش لود خودکار استاندارد توصیه می‌شود و در جامعه PHP به طور گسترده پذیرفته شده است. اگر قبلا این کار را نمی‌کردید، سعی کنید از این به بعد از آن در برنامه‌های خود استفاده نمایید.

جمع‌بندی

در این مقاله در مورد لود خودکار در PHP به همراه معرفی انواع مختلف تکنیک‌های لود خودکار با کامپوزر بحث کردیم. علاوه بر این استانداردهای لود خودکار PSR-0 و PSR-4 را نیز به طور مفصل همراه با مثال‌هایی مورد بررسی قرار دادیم.

منبع

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
3 از 2 رای

/@heshmati74
عرفان حشمتی
Full-Stack Web Developer

مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

عرفان حشمتی

Full-Stack Web Developer