توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .
واسه تعریف کردن کلاس از کلمه class استفاده میشه و زمانی که توی کلاسون میخوایم تابع سازنده داشته باشیم باید اسم اون تابع رو ()construct__ بزاریم، در ابتدا یه فایل بنام Bootstrap.php توی فولدر Libs میسازیم. و کدهای زیر توش مینویسیم (در واقع داریم کلاسی بنام Bootstrap ایجاد میکنیم، در ادامه نقش این فایل رو در وب سایتمون میفهمید)

۱
۲
۳
۴
۵
۶
۷
<?php
class Bootstrap
{
    function __construct()
    {
    }
}

حالا کد های php که توی فایل index.php در قسمت قبلی نوشتیمو اضافه میکنیم به فایل Bootstrap و کدهای php صفحه index.php بصورت زیر ویرایش میکنیم :
کدهای Bootstrap :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
۲۳
۲۴
<?php
class Bootstrap
{
    function __construct()
    {
        if(!isset($_GET['url']))
        {
            $url = 'index';
        }
        else
        {
            $url = $_GET['url'];
        }
        
        $url = explode('/', $url);
        //print_r($url);
        
        if(!file_exists("Controllers/".$url[0].".php"))
        {
            echo "Not Found Page";
        }
    }  
}

کدهای php صفحه index.php :

۱
۲
۳
۴
۵
۶
<?php
    require("libs/Bootstrap.php"); 
    $app = new Bootstrap();
    
?>

اگه بخوایم کدهای یه فایل دیگه رو توی یه فایل دیگه استفاده کنیم از تابع require استفاده میکنیم و خط دوم هم یه شی از نوع کلاس Bootstrap میسازه به نام app$ .
خوب باید سه تابع دیگه بنام های Index,About,Login ایجاد کنیم، پس کدهای زیر توی فایل های Index.php , About.php , Login.php که توی فولدر Controllers هستن مینویسیم . (توی قسمتهای قبلی آموزش، این فایل هارو ایجاد کردیم)
کد About.php :

۱
۲
۳
۴
۵
۶
۷
۸
۹
<?php
class About
{
    function __construct()
    {
        echo "<br>Page About ";
    }
}

کد Index.php :

۱
۲
۳
۴
۵
۶
۷
۸
۹
<?php
class Index
{
    function __construct()
    {
        echo "<br>Page Index ";
    }
}

کد Login.php :

۱
۲
۳
۴
۵
۶
۷
۸
۹
<?php
class Login
{
    function __construct()
    {
        echo "<br>Page Login ";
    }
}

خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :

Image

طبق کدی که من توی کلاس About نوشتم باید زمانی که صفحه about باز میشه متن Page About برام چاپ بشه ولی نشد، مشکل کجاست ؟
باید توی کلاس Bootstrap کدی بنویسیم تا برنامه بفهمه زمانی که توی URL آدرس صفحات سایت تایپ میشه، محتویات اون صفحه نمایش داده بشه .
بعد از آخرین دستور If ، یه else اضافه میکنیم که کدش بصورت زیر میشه :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
if(!file_exists("Controllers/".$url[0].".php"))
{
    echo "Not Found Page";
}
else
{
    $file = "controllers/".$url[0].".php";
    require($file);
    $controller = new $url[0]();
}

کد بالا چک میکنه اگه URL ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [۰]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[۰]url$ قرار میگیره و صفحه about نمایش داده میشه .

Image

میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه url ی وارد کنیم که صفحه ش وجود نداره بهمون خطا میده .
حالا اگه آخر کد Bootstrap و کد About بصورت زیر تغییر بدیم :
کد Bootstrap :

۱
۲
۳
۴
۵
۶
۷
else
{
    $file = "controllers/".$url[0].".php";
    require($file);
    $controller = new $url[0]();
    $controller->$url[1](); 
}

کد About :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
<?php
class About
{
    function __construct()
    {
        echo "<br>Page About ";
    }
    
    function AboutMe()
    {
        echo '<br>........About Me..........<br>';
    }
}

اگه URL بصورت زیر وارد کنیم نتیجه اینجوری میشه :

Image

Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :

Image

نتیجه اینه که کلی به ما خطا میده ، کدهای Bootstrap بصورت زیر ویرایش میکنیم تا دیگه بهمون خطا نده .

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
else
{
    $file = "controllers/".$url[0].".php";
    require($file);
    $controller = new $url[0]();
    if(!empty($url[1]))
    {
        $method_name = $url[1];
        if(method_exists($controller, $method_name))
        {
            $controller->$method_name();
        }
        else
        {
            echo "<br>method not found<br>";
        }
    }  
}

تابع empty چک میکنه که آیا مقداری توی متغیر وجود داره یا نه . (با تابع isset فرق میکنه)
یه متغیر بنام methodname$ تعریف کردم و مقدار [۱]url$ داخل میریزم و بعد با تابع methodexists چک میکنم که آیا تابعی با این نام (یعنی مقدار داخل method_name$) توی کلاس وجود داره یا نه ؟! اگه وجود داشت تابع رو فراخوانی میکنه وگرنه به ما خطای method not found میده . (توی زبانهای برنامه نویسی دیگه زمانی که میخواستیم به توابعی از یه کلاس دسترسی داشته باشیم بعد از نام اون کلاس کاراکتر “.” میزاشتیم و بعد نام تابع، ولی اینجا به جای “.” از “<-” استفاده میشه)
خوب حالا اگه خواستیم یه مقدار به تابعی که توی کلاسمون ایجاد کردیم بدیم و اون تابع بر حسب مقداری که بهش دادیم اعمالی رو انجام بده باید کدهارو کمی تغییر بدیم :
تابع Aboutme یا بصورت زیر تغییر میدیم :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
function AboutMe($str = false)
{
    if($str == true)
    {
        echo '<br>........'.$str.'..........<br>';
    }
    else
    {
        echo '<br>........About Me..........<br>';
    }
}

یا هم بصورت زیر :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
function AboutMe($str = '')
{
    if(empty($str) == false)
    {
        echo '<br>........'.$str.'..........<br>';
    }
    else
    {
        echo '<br>........About Me..........<br>';
    }
}

کد Bootstrap :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
if(!empty($url[1]))
{
    $method_name = $url[1];
    if(method_exists($controller, $method_name))
    {
        if(!empty($url[2]))
        {
            $parametr = $url[2];
            $controller->$method_name($parametr);
        }
        else
        {
            $controller->$method_name();
        }
    }
    else
    {
        echo "<br>method not found<br>";
    }
}

یه متغیر بنام parametr$ تعریف کردم، که اگه مقداری توی [۲]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .

Image