آموزش psr-4 autoloader به همراه مثال

حمید تیموری 185 بازدید 1399/03/16
آموزش psr-4 autoloader به همراه مثال

کلمه PSR مخفف PHP Standard Recommandation است که به استاندارد های کدنویسی در زبان php اشاره میکند و نوع های متفاوتی دارد. در مطلبی دیگر انواع PSR ها را توضیح خواهم داد ولی در این مطلب مشخصا میخواهیم درباره نوع چهارم PSR ها یا همان PSR-4 صحبت کنیم.

این نوع از PSR مسائل مربوط autoloading کلاس ها با توجه به مسیر آنها را مطرح میکند که کاملا قابل تعامل با دیگر مشخصات autoloading از جمله PSR-0 است !
این PSR همچنین توضیح میدهد که با توجه به مشخصات PSR فایل هایی که autoloaded خواهند شد را کجا قرار دهید.
اگر هنوز متوجه نشدید نگران نباشید، با مثالی که در ادامه استفاده میکنیم متوجه خواهید شد.
در این مقاله میخواهیم PSR-4 را با استفاده از composer توضیح دهیم.

اگر به PSR-4 مراجعه کنید خواهید دید که یک کلاس واجد شرایط این PSR دارای فرم زیر است:

\<NamespaceName>(\<SubNamespaceName>)*\<ClassName>

دقت کنید که یک کلاس واجد شرایط باید حتما یک namespace سطح بالاتر داشته باشد که با نام vendor namespace شناخته میشود.

راه اندازی PSR4:
ابتدا باید composer را نصب کنید:
 الف) ویندوز:  برای نصب در ویندوز این لینک را مشاهده کنید
ب) لینوکس و MAC : ترمینال را باز کنید و دستورات زیر را یکی پس از دیگری اجرا کنید:

Step 1: php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 
Step 2: ls | grep composer 
Step 3: php composer-setup.php 
Step 4: php composer.phar -v

و سپس دستور زیر را اجرا کنید :

mv composer.phar /usr/local/bin/composer

حالا ورژن composer را برای اطمینان، چک کنید:

composer -v

بعد از نصب composer روی سیستم عامل خود، ساختاری شبیه به ساختار زیر ایجاد کنید:

فایل composer.json را باز کنید و متن زیر را به آن اضافه کنید:

{
    "autoload": {
        "psr-4": {
            "Laraman\\": "app/Laraman"
        }
    }
}

در اینجا Laraman برای پروژه شما Vendor name محسوب میشود، و شما میتوانید هنگام استفاده به صورت زیر عمل کنید:

namespace Laraman\Model;

طبق مکانیزم PSR-4 در پروژه شما Laraman به عنوان Namespace و Model به عنوان SubNamespace و در نهایت نام Class استفاده میشود.
دوباره و دوباره به ساختار زیر برای درک بهتر دقت کنید:

\<NamespaceName>(\<SubNamespaceName>)*\<ClassName>

امیدوارم که تا این مرحله، یاد گرفته باشید.

حالا به پروژه برگردید و در مسیر root ترمینال را باز کنید و برای نصب psr-4 در پروژه دستور زیر را اجرا کنید:

composer dump-autoload -o

بعد از اجرای این دستور شما Composer را در پروژه خود خواهید داشت و به شکل زیر خواهد بود:

حالا من میخوام به شما توضیح بدم که چگونه از آن استفاده کنید:

مثال PSR-4 : طریقه استفاده 
بعد از تکمیل ساختار زیر

مسیر app/Laraman/Model/User.php را باز کنید و کد زیر را به آن اضافه کنید:

 
namespace Laraman\Model;

class User {
    
    public function __construct(){
       
    }

    public function display(){
        return "I am Laraman";
    }
}

خیلی خوب دقت کنید، مهم ترین قسمت برای درک بهتر همینجاست!
به هیچ وجه ما نیازی نداری که از توابع php مثل include و require برای استفاده از فایل ها استفاده کنیم.
به لطف composer autoloading ما با استفاده از Namespace میتوانیم یک فایل را به یک فایل دیگر اضافه کنیم و از آن استفاده کنیم.
حالا برای درک بهتر فایل app/Laraman/Filters/Filter.php را باز کنید و کد زیر را به آن اضافه کنید:

namespace Laraman\Filters;
use Laraman\Model\User; 

class Filter {
   
    public function __construct(){
       
    }

    public function getDataFromUserClass(User $user){
        return $user->display();
    }
}

نگاه کنید که ما از یک متد در کلاس User در کلاس Filter استفاده کردیم فقط بخاطر کد زیر که در بالای کلاس Filter اضافه شده است:

use Laraman\Model\User;

امیدوارم که مطلب را درک کرده باشید.

حالا فایل init.php را باز کنید و با استفاده یکی از متدهای php به نام require_once فایل autoload.php را به init.php اضافه کنید:

require_once __DIR__ . '/../vendor/autoload.php';

حالا فایل index.php را باز کنید و کد زیر را به آن اضافه کنید:

require_once 'app/init.php';

use Laraman\Filters\Filter;
use Laraman\Model\User as User;

$filter = new Filter();
echo $filter->getDataFromUserClass(new User());

میبینید که ما فقط فایل init.php را اضافه کردیم و هرچه که میخواهیم را میتوانیم استفاده کنیم. این یک مثال ساده برای درک psr-4 بود که چگونه میتوان از آن در پروژه استفاده کرد.
امیدوارم یاد گرفته باشید.
متد getDataFromUserClass در کد بالا خروجی زیر را خواهد داشت.

I am Laraman

اگر سوالی داشتید از قسمت نظرات بپرسید.

دیگر مقالات
حمید تیموری 860 بازدید 1397/06/16
حمید تیموری 1362 بازدید 1397/10/12
حمید تیموری 1360 بازدید 1397/05/14
حمید تیموری 861 بازدید 1397/10/22
امید کیانی 518 بازدید 1398/02/02
نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید