آشنایی با PSR Standards در PHP
استانداردهای PSR (PHP Standards Recommendations) مجموعهای از قراردادها و بهترینروشها هستند که توسط PHP-FIG تعریف میشوند تا تعامل، خوانایی و سازگاری بین کتابخانهها و فریمورکهای PHP بهتر شود. رعایت این استانداردها باعث آسانتر شدن نگهداری، استفاده مجدد و ترکیب بستههای مختلف میشود.
چرا PSR مهم است؟
- افزایش همکاری بین تیمها و پروژهها
- کاهش پیچیدگی هنگام ترکیب کتابخانهها
- تسهیل autoloading و سازگاری با Composer
- ایجاد قراردادهای مشترک برای logging، HTTP، container و غیره
چکیدهای از مهمترین PSRها
| PSR | نام | هدف |
|---|---|---|
| PSR-0 | Autoloading (deprecated) | روش قدیمی نگاشت namespace به فایل |
| PSR-4 | Autoloading | نسخهی مدرنتر و سادهتر برای autoloading |
| PSR-1 / PSR-12 | Coding Style | قواعد اولیه و پیشرفته برای فرمت کد (PSR-12 جایگزین PSR-2) |
| PSR-3 | Logger Interface | یک رابط استاندارد برای logging |
| PSR-7 | HTTP Message | تعریف اشیاء Request/Response مستقل از فریمورک |
| PSR-11 | Container Interface | رابط یکپارچه برای DI container |
| PSR-6 / PSR-16 | Caching | رابطهای caching سطح بالا (PSR-16 سادهتر) |
مثال عملی: PSR-4 با Composer
{
"autoload": {
"psr-4": {
"MyApp\": "src/"
}
}
}
در اینجا namespace با پوشهی src/ نگاشت شده است. حال فرض کنید فایل src/Service/Hello.php را داشته باشیم:
namespace MyAppService;
class Hello
{
public function say()
{
return 'سلام از PSR-4';
}
}
توضیح: Composer براساس PSR-4 مسیر namespace را به فایلها نگاشت میکند؛ بدین ترتیب کافی است composer dump-autoload را اجرا کنید و سپس در پروژه با use MyAppServiceHello از کلاس استفاده کنید. این ساختار موجب جلوگیری از require دستی و بهبود سازماندهی میشود.
مثال PSR-3: استفاده از Logger
use PsrLogLoggerInterface;
class UserService
{
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function createUser(array $data)
{
// ... create user logic
$this->logger->info('User created', ['email' => $data['email']]);
}
}
توضیح: PSR-3 یک رابط استاندارد برای logging تعریف میکند. با تزریق یک شیء که LoggerInterface را پیادهسازی کرده، میتوان بدون وابستگی به یک کتابخانه خاص (مثل Monolog) لاگگیری را انجام داد. این الگو وابستگیها را کاهش داده و تستپذیری را افزایش میدهد.
نمونه فرمتبندی مطابق PSR-12
namespace MyAppService;
class Calculator
{
public function add(int $a, int $b): int
{
return $a + $b;
}
}
توضیح: PSR-12 قواعدی درباره spacing، indentation (معمولاً 4 فاصله)، نامگذاری، اعلام type hints و بازگرداندن نوع (return type) ارائه میدهد. رعایت این قواعد موجب خوانایی و یکپارچگی در کد میشود.
PSR-7: جداسازی HTTP message
PSR-7 تعریف میکند که Request و Response باید اشیاء immutable (غیرقابل تغییر) باشند و متدهایی برای خواندن headers، body، method و دیگر اجزاء ارائه میدهند. این موضوع امکان ساخت middleware یا سرویسهایی که مستقل از فریمورک باشند را فراهم میآورد.
PSR-11: استاندارد برای Dependency Injection Container
با داشتن یک رابط مشترک برای container، کتابخانهها میتوانند بدون شناخت implementation خاص، از container استفاده کنند. دو متد اصلی get() و has() اغلب کافی هستند تا یک قرارداد ساده و موثر ایجاد شود.
نکات عملی و بهترین روشها
- همیشه از PSR-4 بهجای PSR-0 استفاده کنید مگر در شرایط سازگاری معکوس ضروری باشد.
- پروژههای جدید را طبق PSR-12 قالببندی کنید و از ابزارهایی مثل PHP-CS-Fixer یا phpcs برای اتوماسیون استفاده کنید.
- در زمان طراحی کتابخانه، رابطهای PSR (مثل PSR-3، PSR-11، PSR-7) را پیادهسازی یا مصرف کنید تا پذیرش و یکپارچگی افزایش یابد.
- برای caching از PSR-6/PSR-16 استفاده کنید تا بتوانید backendهای مختلف را بهراحتی جایگزین کنید.
- در مستندسازی namespace و ساختار پوشهها شفاف باشید تا توسعهدهندگان دیگر به سرعت با پروژه آشنا شوند.
چالشها و ملاحظات پیشرفته
رعایت PSRها اغلب مزایای زیادی دارد اما نباید بهعنوان محدودیتی صرفاً برای “رسمی بودن” در نظر گرفته شود. گاهی پروژههای خاص نیاز به اقتباس یا ترکیب سبکها دارند (مثلاً قواعد استایل داخلی). همچنین نسخههای قدیمی PHP ممکن است از برخی ویژگیهای PSR-12 پشتیبانی نکنند و نیاز به polyfill یا استثناء باشد.
منابع و گامهای بعدی
- مستندات رسمی PHP-FIG برای مطالعه کامل هر PSR
- ابزارهای Composer، PHP-CS-Fixer، phpcs و تستهای واحد برای تضمین رعایت استانداردها
- بررسی کتابخانههای محبوب (مثل Symfony، Laravel، Zend) برای نمونههای عملی
نتیجهگیری کوتاه: PSRها قراردادهای روشنی برای ساختن کد قابلتجمیع، قابلفهم و قابل نگهداری در اکوسیستم PHP فراهم میکنند. با یادگیری و بهکارگیری درست آنها میتوانید کیفیت و مقیاسپذیری پروژههای PHP خود را بهطور قابلتوجهی افزایش دهید.
آیا این مطلب برای شما مفید بود ؟



