در این مقاله میخواهیم اصول اولیه لودینگ در PHP و نحوه لود خودکار کلاسها به وسیله کامپوزر را مورد بحث قرار دهیم. همچنین توضیح خواهیم داد که چرا لود خودکار اهمیت دارد و نحوه استفاده از کامپوزر برای این کار را به صورت گام به گام به شما نشان میدهیم. در آخر هم به تفاوت بین انواع مختلف لود خودکار در کامپوزر خواهیم پرداخت.
چرا به Autoloading نیاز داریم؟
هنگام ایجاد برنامههای PHP ممکن است لازم باشد از کتابخانههای شخص ثالث استفاده کنید. همانطور که میدانید، اگر بخواهید از این کتابخانهها در برنامه خود کمک بگیرید، باید آنها را با استفاده از عبارت require یا include در فایل منبع برنامه قرار دهید.
مادامی که در حال توسعه برنامههای کوچک هستید، استفاده از این عبارات کفایت میکند. اما هرچقدر که برنامه شما رشد کرده و بزرگتر میشود، لیست عبارات require و include طولانیتر میگردد که نگهداری آنها کمی آزاردهنده و دشوار است. مشکل دیگر این روش آن است که شما کل کتابخانهها را در برنامه خود بارگذاری میکنید، از جمله قسمتهایی که حتی قصد استفاده از آنها را هم ندارید. این باعث میشود حافظه برنامه شما سنگینتر شود.
راه حل چیست؟
برای غلبه بر این مشکل، راه حل ایدهآل آن است که کلاسها را تنها در مواقعی که واقعا مورد نیاز هستند بارگیری کنیم. در اینجاست که autoloading وارد عمل میشود. اساسا هنگامی که از کتابخانهای در برنامه خود استفاده میکنید، لود خودکار بررسی میکند که آیا قبلا بارگیری شده است، در غیر این صورت کلاس مورد نیاز را در حافظه لود میکند. بنابراین کلاس در مکان مورد نیاز بارگذاری میشود – به این کار autoloading میگویند. هنگامی که از لود خودکار استفاده میکنید، نیازی نیست همه فایلهای کتابخانه را به صورت دستی وارد نمایید. شما فقط باید فایل autoloader را که حاوی منطق بارگذاری خودکار است وارد کنید و کلاسهای لازم به صورت داینامیک گنجانده میشوند.
لود خودکار بدون استفاده از Composer
ممکن است تاکنون متوجه نشده باشید، اما امکان پیادهسازی این عملکرد در PHP بدون کامپوزر هم وجود دارد. تابع ()spl_autoload_register چیزی است که این امکان را فراهم میکند. چنین متدی به شما اجازه میدهد زمانی که PHP سعی دارد کلاسهایی را که هنوز لود نشدهاند بارگذاری کند، توابعی را ثبت کنید که در صف لودینگ قرار میگیرند تا به طور متوالی فعال شوند.
در مثال زیر تابعی به نام custom_autoloader داریم که می توانیم هر نامی را تعیین کنیم.این تابع دارای پارامتری برای دریافت نام کلاس برای لود خودکار است.در این تابع یک بار از مسیر مشخص و نام داینامیکی که از پارامتر دریافت می شود include می شود.در انتها هم پسوند php. به نام کلاس چسبیده است.
بعد از تابع دستور مربوط به spl_autoload_register فراخوانی شده است که نام تابعی که حاوی کلاس است را بعنوان پارامتر دریافت کرده است.
مثال:
1 2 3 4 5 6 7 |
<?php function custom_autoloader($class) { include 'lib/' . $class . '.php'; } spl_autoload_register('custom_autoloader'); $objFooBar = new FooBar(); ?> |
بدون لود خودکار، باید از عبارت require یا include برای قرار دادن فایل کلاس FooBar استفاده کنید. پیادهسازی autoloader در مثال فوق بسیار ساده است.