ناشناس

سوال 2451

psr-0 چه مفهومی دارد؟

ثبت پاسخ جدید

برای ثبت پاسخ، لطفا وارد حساب کاربری خود شوید.

پاسخ‌ها

1 پاسخ
این PSR از تاریخ ۲۱-۱۰-۲۰۱۴ منقضی شده و PSR4 به جای آن معرفی شده است.
این PSR قواعد اجباری برای پیوستگی Autoloader ها را توصیف می کند. 
قواعد اجباری
یک Namespace و Class خوب باید حتما طبق قاعده زیر باشد
\<Vendor Name>\(<Name Space>\)*<Class Name>
هر Namespace باید شامل Namespace بالایی خود باشد. Vendor Name
هر Namespace می تواند به هر تعداد که خواسته باشد Namespace فرزند داشته باشد.
هر جداکننده Namespace  هنگام بارگزاری از سیستم به DIRECTOR_SEPRATOR تبدیل می شود.
هر کاراکتر _ در نام کلاس به DIRECTORY_SEPRATOR تبدیل می شود. کاراکتر _ در Namespace معنی خاصی ندارد.
یک Namepsace یا Class مناسب با پسوند .php هنگام بارگزاری از سیستم شناخته می شود. 
حروف الفبا در نام Vendor, Namespace, Class می تواند ترکیبی از حروف بزرگ یا کوچک باشد.
چند مثال
\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
Underscore در Namespace و نام Class
\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
مثال پیاده سازی
در این جا یک مثال آورده‌ایم تا نحوه پیاده سازی قواعد بالا را مشاهده کنید.
<?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 را مشاهده کنید. 
http://gist.github.com/221634