توی این قسمت میخوایم وارد بحث کلاسها بشیم و همینطور که پیش میریم با چندتا باگ دیگه برخورد میکنیم که بهتون میگم چه جوری برطرفش کنید .
واسه تعریف کردن کلاس از کلمه 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 " ; } } |
خوب حالا یه تست میکنیم ببینیم چه جوری اجرا میشه :
طبق کدی که من توی کلاس 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 نمایش داده میشه .
میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه 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 بصورت زیر وارد کنیم نتیجه اینجوری میشه :
Aboutme بعنوان یکی از توابع کلاس About هست ، که اینجوری توی URL میشه بهش دسترسی داشت .
اگه این سری URL بصورت زیر وارد کنیم :
نتیجه اینه که کلی به ما خطا میده ، کدهای 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$ و به عنوان پارامتر تابع استفاده میشه .