تا %60 تخفیف خرید برای 5 نفر با صدور مدرک فقط تا
00 00 00
در توسینسو تدریس کنید

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

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

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

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

طبق کدی که من توی کلاس 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 ی بنویسیم که وجود نداره خطا بده، در غیر این صورت صفحه مورد نظر نشون بده و در اینجا مقدار [0]url$ برابر about هست، در نتیجه زمانی که کد اجرا میشه ()about بجای ()[0]url$ قرار میگیره و صفحه about نمایش داده میشه .

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

میبینید که جواب داد میتونید بقیه صفحه هارو هم امتحان کنید و اگه 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 بصورت زیر وارد کنیم نتیجه اینجوری میشه :

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

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

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

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

نتیجه اینه که کلی به ما خطا میده ، کدهای 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$ تعریف کردم و مقدار [1]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$ تعریف کردم، که اگه مقداری توی [2]url$ بود این مقدار ریخته میشه توی متغییر parametr$ و به عنوان پارامتر تابع استفاده میشه .

دوره آموزشی برنامه نویسی MVC در PHP قسمت چهارم

امیدوارم از این قسمت هم استفاده لازم برده باشید .

نویسنده : مهدی رزمجویی

منبع : جزیره طراحی و توسعه وب وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

نظر شما
برای ارسال نظر باید وارد شوید.
12 نظر
افرادی که این مطلب را خواندند مطالب زیر را هم خوانده اند