بایگانی ماهیانه: فروردین ۱۳۹۷

autoloading in php اتولودینگ در php

پ ن : این مطلب برای یاداشت کردن آموخته های خودم در مورد Autoloading است و ساختار آموزشی ندارد.

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

برای اتولودینگ شما باید قبل از کد نویسی ساختار فایل ها را مشخص کنید و قوانینی برای خود برای نام فایل ها و نام کلاس ها انتخاب کنید یا اینکه از روش های استاندارد برای این کار استفاده کنید.

برای نوشتن کد به صورت شی گرایی (قانون نانوشته) به ازای هر کلاس یک فایل با نام کلاس ایجاد می کنیم . مثلا اگر قرار است کلاس Hello را بنویسم یک فایل هم با نام Hello.php ایجاد می کنیم و این کلاس را در همین فایل تعریف میکنیم.

دو کلاس داریم به نام Linux و Windows و هر کدام متدی به نام say دارند که یک نام سیستم عامل را چاپ میکند.

روش سنتی برای لود کردن کلاس ها :

Linux.php


namespace Os;
class Linux 
{
public function say() { echo "Linux\n"; }
}

Windows.php


 namespace Os;
 class Windows {
 public function say() { echo "Windows\n"; }
 }
 

index.php


require "./Os/Linux.php";
require "./Os/Windows.php";

$os1 = new Os\Linux();
$os1->say(); // Linux

$os2 = new Os\Windows();
$os2->say(); // Windows

 

روش استفاده از اتولودینگ :‌ برای این کار معمولا یک کلاس اتولودینگ تعریف میکنیم و در آن متدی تعریف میکنیم که با استفاده از متد spl_autoload_register می تواند نام کلاس ها را تشخیص دهد و هر زمان که بخواهیم یک کلاس را new کنیم (یک نمونه از کلاس ایجاد کنیم) خودش آن کلاس را لود می کند.

Autoload.php


class Autoload
{
 public function load($className)
 {
   $file = __DIR__ .'/'. str_replace('\\', '/', $className) . '.php';
   if (file_exists($file)) {
    require $file;
   } else {
   return false;
   }
 }
 public function register()
 {
  spl_autoload_register([$this, 'load']);
 }
}

$loader = new Autoload();
$loader->register();

index.php


require "./Autoload.php";

$os1 = new Os\Linux();
$os1->say(); // Linux

$os2 = new Os\Windows();
$os2->say(); // Windows

الان اگر کلاس Mac را هم در پوشه Os اضافه کنیم به صورت خودکار لود می شود و می توانیم از آن استفاده کنیم.

دانلود فایل Autolader.zip

منابع :‌
http://ir2.php.net/autoload
http://phpbridge.org/intro-to-php/autoloading