به منظور درک ماهیت دستورات شرطی if و switch در زبان PHP، در این آموزش قصد داریم آنچه تاکنون در مورد دستورات شرطی فرا گرفتهایم را در قالب یک پروژهٔ ماشین حساب ساده پیادهسازی کنیم. برای این منظور، ابتدا کدهای زیر را در نظر میگیریم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Simple PHP Calculator</title>
</head>
<body>
<form action="index.php" method="POST">
First number:
<br>
<input type="text" name="number1">
<br>
Second number:
<br>
<input type="text" name="number2">
<br>
Operation type:
<br>
<input type="radio" name="operation_type" value="+"> +
<br>
<input type="radio" name="operation_type" value="-"> -
<br>
<input type="radio" name="operation_type" value="*"> ×
<br>
<input type="radio" name="operation_type" value="/"> ÷
<br>
<input type="submit" name="submit" value="=">
</form>
<?php
$firstNumber = $_REQUEST['number1'];
$secondNumber = $_REQUEST['number2'];
$operationType = $_REQUEST['operation_type'];
$result = null;
switch ($operationType) {
case '+':
$result = $firstNumber + $secondNumber;
break;
case '-':
$result = $firstNumber - $secondNumber;
break;
case '*':
$result = $firstNumber * $secondNumber;
break;
case '/':
$result = $firstNumber / $secondNumber;
break;
default:
$result = "Undefined operation!";
}
echo 'Result is <strong style="color:#ffde57">' . $result . '</strong>';
?>
</body>
</html>
میبینیم که در این پروژه، کدهای HTML و PHP را در قالب یک فایل در کنار یکدیگر قرار دادهایم. لذا ضروری است که پسوند فایل مد نظر حتماً php. باشد چرا که در غیر این صورت، اگر فایل را در لوکالهاست اجرا کنیم، کدهای PHP تفسیر نخواهند شد. باتوجه به این که کدهای PHP که قرار است معادلات را انجام دهند داخل همین فایل قرار دارند، لذا ضروری است که به عنوان مقدار اتریبیوت action این فرم، نام همین فایل -index.php- را قرار دهیم. به عبارت دیگر، با Submit کردن این فرم، دیتای فرم به همین فایل اجراع داده خواهند شد.
در تفسیر کدهای فوق بایستی بگوییم که یک فرم سادهٔ HTML طراحی کردهایم که حاوی دو فیلد برای گرفتن اعداد و فیلدی هم برای مشخص کردن نوع علمیات ریاضیاتی دارا است. سپس داخل تگهای <? php?> که پس از فرم مد نظر قرار گرفتهاند، چهار متغیر تعریف کردهایم تحت عناوین operationType ،$secondNumber ،$firstNumber$ و result$ که به ترتیب به معنی «عدد اول»، «عدد دوم»، «نوع عملیات» و «نتیجه» هستند.
پیش از این، با متغیر به اصطلاح سوپرگلوبال REQUEST_$ آشنا شدهایم؛ کاری که این متغیر از پیش تعریف شده در زبان PHP انجام میدهد این است که کلیهٔ دیتای ارسالی به صورت GET یا POST را در خود ذخیره میسازد. با این تفاسیر، ما به مقادیر فیلدهای فرم خود دسترسی داشته و آنها را در متغیرهایی متناظر با نامشان ذخیره میسازیم.
همچنین فیلدی داشتیم از نوع Radio که نوع علمیات ریاضیاتی را مشخص میکرد؛ مقدار این فیلد را در متغیر مرتبط با آن ریخته و در نهایت یک متغیر تحت عنوان result$ به منظور ذخیرهسازی نتیجهٔ نهایی با مقدار پیشفرض null ایجاد کردهایم.
همانطور که مشاهده میشود، در ادامه از یک دستور شرطی switch استفاده کردهایم که متغیر operationType$ را به عنوان پارامتر ورودی گرفته و بسته به مقدار آن، یکی از دستورات مرتبط با چهار عمل اصلی را انجام میدهد و چنانچه شرطی برقرار نگردد، دستور داخل default اجرا میگردد که چیزی نیست جز اختصاص استرینگی تحت عنوان !Undefined operation به متغیر result$. در نهایت هم استرینگی با کمی کد CSS حاوی مقدار متغیر result$ را چاپ کردهایم. حال برای تست، یک بار از طریق لوکالهاست فایل مد نظر را باز میکنیم:
Notice: Undefined index: number1 in /var/www/sokanacademy-php-course/03/03-calculator/index.php on line 31
Notice: Undefined index: number2 in /var/www/sokanacademy-php-course/03/03-calculator/index.php on line 32
Notice: Undefined index: operation_type in /var/www/sokanacademy-php-course/03/03-calculator/index.php on line 33
Result is Undefined operation!
میبینیم بدون این که کاری انجام دهیم، سه هشدار در معرض دیدمان قرار گرفته است. دلیل چنین مسئلهای آن است که به محض اجرای این فایل، مفسر PHP به سراغ کدهایی که مابین تگهای <? php?> قرار گرفته میرود و از آنجا که هیچ دیتایی از طریق فرم مد نظر اصطلاحاً POST (ارسال) نشده است، مسلماً داخل متغیر سوپرگلوبال REQUEST_$ نیز هیچکدام از کلیدهای در نظر گرفته شده (همچون number1 و غیره) وجود ندارد و لذا مفسر PHP به ما هشدار میدهد که چنین کلیدهایی وجود خارجی ندارند! برای رفع این مشکل، کدهای فوق را به صورت زیر ریفکتور میکنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Simple PHP Calculator</title>
</head>
<body>
<form action="index.php" method="POST">
First number:
<br>
<input type="text" name="number1">
<br>
Second number:
<br>
<input type="text" name="number2">
<br>
Operation type:
<br>
<input type="radio" name="operation_type" value="+"> +
<br>
<input type="radio" name="operation_type" value="-"> -
<br>
<input type="radio" name="operation_type" value="*"> ×
<br>
<input type="radio" name="operation_type" value="/"> ÷
<br>
<input type="submit" name="submit" value="=">
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$firstNumber = $_REQUEST['number1'];
$secondNumber = $_REQUEST['number2'];
$operationType = $_REQUEST['operation_type'];
$result = null;
switch ($operationType) {
case '+':
$result = $firstNumber + $secondNumber;
break;
case '-':
$result = $firstNumber - $secondNumber;
break;
case '*':
$result = $firstNumber * $secondNumber;
break;
case '/':
$result = $firstNumber / $secondNumber;
break;
default:
$result = "Undefined operation!";
}
echo 'Result is <strong style="color:#ffde57">' . $result . '</strong>';
}
?>
</body>
</html>
در حقیقت، کاری که پس از ریفکتور کردن کدهای فوق صورت گرفته این است که کلیهٔ اسکریپتهای PHP را داخل یک دستور شرطی قرار داده و در این دستور شرطی هم گفتهایم چنانچه کلید REQUEST_METHOD متغیر سوپرگلوبال REQUEST_$ برابر با POST بود، دستورات داخل if اجرا شوند و در غیر این صورت، هیچ اتفاقی رخ ندهد. به عبارت دیگر، اسکریپتهای ما صرفاً زمانی اجرا خواهند شد که کاربر روی دکمهٔ = کلیک کند (یا فرم را اصطلاحاً Submit کند).
اکنون جهت تست برنامه، در فیلد اول عددی همچون ۷ و در فیلد دوم نیز عددی همچون ۳ را وارد کرده سپس یکی از چهار عمل اصلی همچون + را در نظر میگیریم و روی دکمهٔ = کلیک میکنیم و خواهیم دید که عدد ۱۰ به رنگ زرد نمایش داده خواهد شد. تا اینجای کار برنامه به درستی کار میکند اما قصد داریم در ادامه شرایط مختلفی را در نظر بگیریم.
به طور مثال، قصد داریم ببینیم که اگر کاربر سهواً یا عمداً به جای یک عدد صحیح -همچون اعداد ۰ تا ۹- یک حرف یا علامت -همچون A یا #- را وارد فیلد اعداد کند چه اتفاقی رخ خواهد داد؟ با تست شرایط فوق در برنامه، میبینیم که نتیجهٔ مد نظر بهدست نمیآید؛ برای این منظور، میبایست مجدد کدهای فوق را بهصورت زیر ریفکتور و تکمیل کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Simple PHP Calculator</title>
</head>
<body>
<form action="index.php" method="POST">
First number:
<br>
<input type="text" name="number1">
<br>
Second number:
<br>
<input type="text" name="number2">
<br>
Operation type:
<br>
<input type="radio" name="operation_type" value="+"> +
<br>
<input type="radio" name="operation_type" value="-"> -
<br>
<input type="radio" name="operation_type" value="*"> ×
<br>
<input type="radio" name="operation_type" value="/"> ÷
<br>
<input type="submit" name="submit" value="=">
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$firstNumber = $_REQUEST['number1'];
$secondNumber = $_REQUEST['number2'];
$operationType = $_REQUEST['operation_type'];
$result = null;
if (is_numeric($firstNumber) && is_numeric($secondNumber)) {
switch ($operationType) {
case '+':
$result = $firstNumber + $secondNumber;
break;
case '-':
$result = $firstNumber - $secondNumber;
break;
case '*':
$result = $firstNumber * $secondNumber;
break;
case '/':
$result = $firstNumber / $secondNumber;
break;
default:
$result = "Undefined operation!";
}
echo 'Result is <strong style="color:#ffde57">' . $result . '</strong>';
} else {
echo 'Please enter a valid value.';
}
}
?>
</body>
</html>
کاری که در اسکریپت فوق انجام دادهایم این است که از یک دستور شرطی if به همراه فانکشن از پیش تعریف شدهای در زبان PHP تحت عنوان ()is_numeric جهت تست کردن فیلدها استفاده کردهایم. به عبارت دیگر، فانکشن ()is_numeric چک میکند ببیند که آیا مقدار پارامتر ورودیاش عدد است یا خیر؛ اگر عدد بود مقدار true و در غیر این صورت مقدار false را باز میگرداند. در این دستور شرطی با استفاده از اپراتور && به معنی «و» دستور دادهایم که اگر هر دوی متغیرها مقدار عددی داشتند، دستورات داخل if اجرا شده و در غیر این صورت دستور داخل else که حاوی چاپ عبارت .Please enter a valid value است چاپ شود.
آنچه مسلم است اینکه این برنامه بهمراتب بیشتر جای کار دارد؛ به طور مثال، بایستی اگر کاربری فیلدها را پر کرد اما یکی از اِلِمانهای Radio را انتخاب نکرد جلویش گرفته شود و یا اگر مثلاً عدد ۰ را تقسیم بر ۸ کرد به وی هشدار داده شود که چنین مسائلی به سادگی با استفاده از چندین دستور شرطی دیگر امکانپذیر خواهند شد.