PSR-0 : استاندارد Autoloading
هر کدام از استانداردهای سری PSR به یک معقوله ای جدا در PHP اشاره میکنند. استاندارد PSR-0 در مورد autoloading در PHP است. در واقع بهتر است ابتدا در مورد autoloading در خود PHP کمی صحبت کنیم.
در زبان PHP اکثر برنامه نویسان کلاس های خود را درون فایلی جداگانه و همنام با نام کلاس ذخیره میکنند. برای مثال کلاس Post درون فایل Post.php ذخیره میشود. حالا برای استفاده از این کلاسها باید تک تک آنها را به صورت دستی لود کرد که اصلاً کار جالبی نیست.
برای رفع این مشکل، PHP تابعی به نام spl_autoload_register معرفی کرده است. درواقع زمانی که ما از یک کلاس استفاده میکنیم، PHP سعی میکند آن کلاس را پیدا کرده (قائدتا درون همان فایل) و آن را لود کند اما زمانی که نتواند کلاس را پیدا کند پیغام خطا برمیگرداند. حالا ما با استفاده از تابع spl_autoload_register میتوانیم یک callback تعریف کنیم و لود کردن کلاس هایمان را خودمان بر عهده بگیریم.
همچنین مزیت بسیار مهم دیگری که autoload دارد این است که فقط کلاسهایی که در کدها استفاده میشوند لود میشوند و کلاسهایی که مورد استفاده قرار نگیرند لود نخواهند شد زیرا لود شدن فایلها به صورت داینامیک انجام میپذیرد.
زمانی که PHP نتواند کلاس را لود کند callback ایجاد شده توسط ما را صدا میزند. مثال:
spl_autoload_register(function($className)
{
require ‘vendor/’.$className.’.php’;
});
$post = new Post;
$post->new();
در کد بالا کلاس Post در واقع در مسیر vendor/Post.php است. حالا که ما یک شی جدید از Post میسازیم و PHP نمیتواند محل کلاس را پیدا کنید callback ما اجرا میشود و ما درون این فایل مسیر درست کلاس را میسازیم و آن را لود میکنیم.
شما میتوانید به صورتهای گوناگونی از spl_autoload_register استفاده کنید اما روش استاندارد آن نیز با نام استاندارد PSR-0 وجود دارد که میتوانید از آن نیز استفاده کنید.
قوانین استاندارد PSR-0
آدرس کامل namespace و نام کلاس باید به صورت ساختار \(\)*\ باشد.
هر namespace باید یک namespace سطح بالا (top-level) داشته باشد (“Vendor Name”).
هر namespace میتواند تعداد زیادی sub-namespace داشته باشد.
هر namespace separator در زمان لود کلاس به DIRECTORY_SEPARATOR تبدیل میشود.
هر کاراکتر ـ (underscore) در نام کلاس تبدیل به DIRECTORY_SEPARATOR میشود و در namespace هیچ معنای خاصی ندارد.
پسوند php. به انتهای نام کلاس اضافه میشود.
مسیر ساخته شده از نظر Camel Case مشابه آدرس کامل namespace و نام کلاس است.
چند مثال از تبدیل ها:
\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
مثالی از پیادهسازی PSR-0
کد زیر مثالی ساده از پیادهسازی PSR-0 است.
<?php
function autoload($className)
{
$className = ltrim($className, ‘\\’);
$fileName = ”;
$namespace = ”;
if ($lastNsPos = strrpos($className, ‘\\’)) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace(‘\\’, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace(‘_’, DIRECTORY_SEPARATOR, $className) . ‘.php’;
require $fileName;
}
spl_autoload_register(‘autoload’);
پیاده سازی SplClassLoader
در زیر یک gits ساده از پیاده سازی SplClassLoader است که اگر شما استانداردهای autoloader را که در بالا ارائه شده است دنبال کنید، میتواند کلاس های شما را بارگیری کند.SplClassLoader یک پیشنهاد متداول برای بارگزاری کلاس های PHP 5.3 است که این استاندارد ها را پشتیبانی می کند.