23
تشکر

استاندارد PSR-0 در PHP

PHP – پی اچ پی

PHP – پی اچ پی

هر زبان برنامه نویسی، دارای استانداردها و قوانین مربوط به خودش است که زبان PHP نیز از این قائده مستثنا نیست. استانداردهای PSR که مخفف PHP Standards Recommendation هستند، استانداردهایی معمول در PHP هستند که اکثر توسعه دهندگان PHP از آن‌ها تبعیت میکنند. اما استانداردهای سری PSR، استانداردهای لازم الجرا نیستند و هر کسی میتواند آن‌ها را نادیده بگیرد و از استانداردهای خودش استفاده کند، اما از آنجا که استفاده از این استانداردها باعث یکپارچگی در کدهای PHP خواهد شد، بنابراین استفاده از آن‌ها توصیه میشود.

در حال حاضر 5 استاندارد PSR (از PSR-0 تا PSR-4) وجود دارد. در این مطلب سعی میکنیم در مورد استاندارد PSR-0 که مهمترین استاندارد نیز است کمی صحبت کنیم.

در ادامه مطلب همراه ما باشید…

استاندارد PSR-0

هر کدام از استانداردهای سری 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 و نام کلاس باید به صورت ساختار \<Vendor Name>\(<Namespace>\)*<Class Name> باشد.

هر namespace باید یک namespace سطح بالا (top-level) داشته باشد.

هر 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 است.

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');

بوسیله کد بالا به راحتی میتواند کلاس‌های خودتان را بدون به کار بردن require در فایل لود کنید و همچنین از استاندارد PSR-0 استفاده کنید.

اما اگر به دنبال کد جامع تری میگردید میتوانید از کلاس SplClassLoader استفاده کنید.

اما بهترین استفاده از PSR-0 یا PSR-4، استفاده از آن همزمان با Composer است که در مطالبی جداگانه به آموزش Composer میپردازیم.

این مطلب از سری مطالب، استانداردهای PSR است
  • مثل همیشه عالی بود دمت گرم داداش شفیعی

  • محمد حسین می‌گه:

    خیلی خوب بود.
    راستش یکی از متد های جادویی php هم هست که به اینصورت هست : __autoload
    گفتم شاید دوستانی که به شی گرایی علاقه مند هستند، از این متد استفاده کنند.
    یا حق.

    • محسن شفیعی می‌گه:

      درسته، تابع autoload__ هم مشابه همین هست اما بهتره از این تابع استفاده نشه چون به احتمال زیاد در نسخه های بعدی PHP حذف خواهد شد

  • مطلب خوبی بود. با اون که من Net framework. کار میکنم اما خوشم اومد.
    در مورد مطالب هم اگه بدونم Asp.Net طرفدار داره اینجا مطمئنا مطالب جالبی دارم که بخوام بذارم.
    با تشکر

    • در ضمن در مورد اون 2 تا مطلبی که گذاشتم بهتره این رو بهتون بگم که واقعا تاثیر گذار هست فقط نیاز هست با دقت مطالعش کنید. بخصوص فرانتند کارها حتما باید توجه کنن. خود من سر پروژه جدیدی که دارم روش کار میکنم اون اصول رو پیاده کردم و فوق العاده تاثیر گذار بود.
      آقای شفیعی شرمنده که پست رو به بیراهه کشوندم.

  • آرمان می‌گه:

    عالیه آقای شفیعی ، ممنون از زحماتتون .

  • ممنون اقای شفیعی

  • آروین می‌گه:

    راستی قسمت تشکر ها خرابه

  • آروین می‌گه:

    و اینم دومیش!!!

  • آروین می‌گه:

    سلام

    مطلب خیلی خوب بود ممنون

    بابا آقای شفیعی مایوس چرا؟ من که همیشه نظر میزارم که…

    حالا برای اینکه امیدوار بشین تو این مطلب 2 تا نظر میزارم

    این اولیش…

    • محسن شفیعی می‌گه:

      لطف دارین. البته من خودمو نگفتم، من اگه خودم تنها هم خواننده آپارنت باشم بازم ادامه میدم. بیشتر برای نویسنده های جدید میگم.
      بازم ممنون از همه

  • رضا می‌گه:

    با تشکر از مطالبتون …
    منم همیشه مطالبتون رو دنبال میکنم… لطفا روی پست هاتون سیستم لایک بگذارید … اونجوری فکر نکنم دیگه دلسرد و مایوس بشید…
    موفق باشید.

  • احمد می‌گه:

    ممنون

  • علی می‌گه:

    فقط می خواستم اعلام بکنم که مطالب دنبال میشه. خدا قوت. موفق باشید!

  • sarvi می‌گه:

    man ba amuzeshhaye vaghan mofid va be ruze site shoma tunestam 2 mogheiate kari khub dashte basham …k tu zendegie kare hefie kheyli behem komak kard .

    vaghan mamnun babate share bidarighe etelaat :)

    • محسن شفیعی می‌گه:

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


  • نظرات این مطلب بسته است.