
משפטי תנאי if-else בשפת PHP
הצהרת if מעריכה "מצב" (statement), לעיתים מכונה גם "ביטוי" (expression). אם הביטוי מוערך כ-true, בלוק הקוד הראשי של ה-if מבוצע. אם התנאי מוערך כ-false, הבלוק הראשי לא מבוצע.
ניתן להרחיב את תנאי ה-if בבלוק else. בלוק זה יבוצע אם הביטוי מוערך כ-false.
תחביר:
<?php
if (condition) {
// Code to execute if the condition is true
} else {
// Code to execute if the condition is false
}
?>
דוגמה:
<?php
$age = 20;
if ($age >= 18) {
echo "You are an adult.";
} else {
echo "You are not an adult.";
}
?>
אופרטורים לתנאי if
אופרטורים שונים משמשים לעתים קרובות בתנאי if להשוואת ערכים.
ב-PHP יש מספר אופרטורים להשוואה בהם ניתן להשתמש:
שוויון ערכים ==
לא שווה =! או <>
זהות (שוויון טיפוסים וערכים) ===
לא זהה ==!
גדול, קטן, גדול שווה, קטן שווה <, >, =<, =>
דוגמה:
<?php
$a = 10;
$b = '10';
if ($a == $b) { // true because values are equal
echo '$a is equal to $b';
}
if ($a === $b) { // false because types are different (int vs string)
echo '$a is identical to $b';
}
?>
שירשור תנאים באמצעות elseif
ניתן לשרשר תנאים מרובים באמצעות elseif. כך ניתן לבחון מספר תנאים ולהפעיל בלוקים שונים של קוד על סמך התנאי הנכון.
תחביר:
if (condition1) {
// Code to execute if condition1 is true
} elseif (condition2) {
// Code to execute if condition2 is true
} else {
// Code to execute if none of the conditions are true
}
דוגמה:
<?php
$score = 85;
if ($score >= 90) {
echo "You got an A!";
} elseif ($score >= 80) {
echo "You got a B!";
} else {
echo "You need to study more.";
}
?>
תנאי if-else מקוננים
ניתן לבצע קינון של תנאי if-else. קינון משמעו לשים תנאי if-else בתוך בלוק של תנאי if-else אחר.
דוגמה:
<?php
$age = 20;
$hasPermission = true;
if ($age >= 18) {
if ($hasPermission) {
echo "You are allowed to enter.";
} else {
echo "You need permission to enter.";
}
} else {
echo "You are too young to enter.";
}
?>
האופרטור הטרינרי
ניתן לנסח תנאי if-else בצורה מקוצרת באמצעות אופרטור טרינרי, העושה שימוש בסימן : ובסימן ?.
ביטוי טרינרי מחזיר ערך בהתאם לתנאי: אם התנאי מתקיים - מוחזר הערך הראשון. אם התנאי לא מתקיים - מוחזר הערך השני.
תחביר:
(condition) ? true_expression : false_expression;
דוגמה:
<?php
$isMember = true;
$fee = $isMember ? 10 : 25;
echo "The fee is $fee.";
?>
ניתן לקנן אופרטורים טרינריים, אך לא תמיד הדבר מומלץ, שכן הקינון מסרבל את קריאות הקוד.
דוגמה:
<?php
$age = 20;
echo ($age >= 18) ? ($age >= 21 ? "You are allowed to drink alcohol." : "You are an adult.") : "You are a minor.";
?>
אופרטור Null Coalescing
אופרטור ה-null coalescing (??) שימושי כאשר בודקים אם משתנה מוגדר או שיש לו ערך שאינו ריק. שימוש באופרטור הזה מקצר את הקוד וחוסך בדיקה מיותרת אם המשתנה הוא null או לא.
דוגמה:
<?php
$username = $_GET['user'] ?? 'Guest';
echo "Hello, $username!";
?>
בדוגמה זו, אם המשתנה GET['user'] מוגדר ואינו מחרוזת ריקה, אז המשתנה username יקבל את ערכו. אחרת, המשתנה username יקבל את ערך המחרוזת Guest.
הטמעת תנאי if-else ישירות ב-HTML
ניתן להשתמש בלוגיקת if-else ישירות בתוך פלט ה-HTML, כדי להציג תוכן באופן מותנה.
דוגמה:
<?php
$userLoggedIn = true;
?>
<!DOCTYPE html>
<html>
<body>
<h1>Welcome, <?= $userLoggedIn ? 'User' : 'Guest'; ?>!</h1>
</body>
</html>
בדוגמה זו, סטטוס ההתחברות של המשתמש נקבע ישירות ב-HTML כדי להציג באופן דינמי את "משתמש" או "אורח".
נשים לב בדוגמה לסימן השווה (=) שמופיע לפני המשתנה userLoggedIn. סימן זה משמעותו הדפסה (כמו הפקודה echo). נפוץ מאוד להשתמש בו כאשר משלבים קטעי קוד PHP קצרים בתוך HTML, המחשבים ערך ומוחזרים להדפסה.
תחביר אלטרנטיבי לתנאי if-else
PHP מציעה מבנה תחבירי אלטרנטיבי למבנה הבלוק המוכר של if-else שהצגנו.
דוגמה:
<?php
if ($score >= 90):
echo "You got an A!";
elseif ($score >= 80):
echo "You got a B!";
else:
echo "You need to study more.";
endif;
?>
מבנה זה נפוץ פחות וכמעט ואינו בשימוש. עם זאת, יש לו יתרון גדול לקריאות הקוד כאשר הבלוקים של הקוד המבוצעים הם גדולים במיוחד.
סקירת ביטויים אלטרנטיביים המתפרשים כ-true או כ-false
כאמור, תנאי ה-if חייב לכלול ביטוי, אשר מוערך כ-true או כ-false. לעיתים, נרצה לשלב coercion (המרה אוטומטית) לערכים שונים, אשר יתפרשו כ-true או כ-false.
להלן רשימת ערכים שמוערכים כ-false:
- הערך 0 (שלם integer) או 0.0 (נקודה צפה float)
- מחרוזת ריקה "" או שכוללת את הערך 0 או 0.0
- מערך ריק []
- הערך null
להלן רשימת ערכים שמוערכים כ-true:
- ערך מספרי שאינו אפס
- מחרוזת שאינה ריקה והערך שלה אינו 0 או 0.0
- מערך שאינו ריק
- אובייקט שאינו null
דוגמה:
<?php
$values = [
0, // Zero integer
0.0, // Zero float
"", // Empty string
[], // Empty array
null // Null object
];
foreach ($values as $value) {
if ($value) {
echo "Value is false.\n";
}
}
$values = [
42, // Non-zero integer
3.14, // Non-zero float
"PHP", // Non-empty string
[1, 2, 3], // Non-empty array
new stdClass() // Object
];
foreach ($values as $value) {
if ($value) {
echo "Value is true.\n";
}
}
?>
טיפים לשימוש חכם יותר של תנאי if
שימוש בסוגריים מסולסלים לסימון בלוק
כאשר הבלוק המבוצע ב-if או הבלוק המבוצע ב-else הוא רק בן פקודה אחת, ניתן להסיר את הסוגריים המסולסלים. עם זאת, נמליץ שלא להסיר אותם, כדי למזער טעויות.
דוגמה:
<?php
// bad
if ($age > 18)
echo "You are an adult.";
echo "Welcome!"; // This will execute regardless of the if condition!
// good
if ($age > 18) {
echo "You are an adult.";
echo "Welcome!";
}
?>
בדוגמה זו, בקטע ה-if הראשון לא שמנו סוגריים מסולסלים לסימון הבלוק, ולכן, אם התנאי של ה-if מתקיים, תבוצע פקודת ה-echo הראשונה. פקודת ה-echo השניה תבוצע בכל מקרה, כיוון שהיא אינה חלק ממשפט ה-if. העימוד של שורת ה-echo השניה מטעה במקרה זה.
הימנעות מקינון מסורבל של תנאי if
במקרה של תנאים רבים המקוננים זה בתוך זה, מומלץ לשקול תכנון מחדש של כל הלוגיקה של הקוד, באופן שיפשט את ההתניות המסורבלות.
דוגמה:
<?php
// bad
if ($isLoggedIn) {
if ($hasPermission) {
if ($isAdmin) {
echo "Welcome, admin!";
} else {
echo "Access denied.";
}
} else {
echo "Permission required.";
}
} else {
echo "Please log in.";
}
// good
if (!$isLoggedIn) {
echo "Please log in.";
return;
}
if (!$hasPermission) {
echo "Permission required.";
return;
}
if ($isAdmin) {
echo "Welcome, admin!";
} else {
echo "Access denied.";
}
?>
שימוש בתנאים מורכבים והקטנת מספר תנאי ה-if
במידת האפשר, מומלץ למזג משפטי if מקוננים באמצעות שימוש באופרטורים || או && ובכך לפשט את הלוגיקה של הקוד.
דוגמה:
<?php
// bad
if ($user !== null) {
if ($user->isLoggedIn()) {
echo "Welcome, " . $user->getName();
}
}
// good
if ($user !== null && $user->isLoggedIn()) {
echo "Welcome, " . $user->getName();
}
?>
שימוש באופרטורים להשוואה קפדנית
יש לשקול שימוש באופרטורים === או ==! להשוואה קפדנית יותר, אשר משווה גם את הטיפוס של המשתנים ולא רק את הערך. הדבר חוסך טעויות כאשר המשתנה יכול להיות מטיפוס לא ידוע.
דוגמה:
<?php
$number = 0;
// bad
if ($number == false) {
echo "The value is considered false.";
}
// good
if ($number === false) {
echo "The value is exactly false.";
} else {
echo "The value is not exactly false.";
}
?>
שימוש באופרטור הטרינרי
בתנאים פשוטים, מוטב להשתמש באופרטור הטרינרי שמקצר את הקוד ומקטין את הסיכוי לטעויות.
דוגמה:
<?php
// bad
if ($score > 50) {
$result = "Pass";
} else {
$result = "Fail";
}
echo $result;
// good
$result = ($score > 50) ? "Pass" : "Fail";
echo $result;
?>
צמצום מיותר של קריאות לפונקציות בתנאי ה-if
שימוש במשתנה מהיר יותר מקריאה לפונקציה. לכן, רצוי שביטוי התנאי של ה-if לא יכלול חזרות מיותרות של קריאות לפונקציות. ניתן לבצע חישוב של ערך הפונקציה מחוץ לתנאי ה-if ולהשתמש בביטוי של ה-if בערך שחושב מבעוד מועד.
דוגמה:
<?php
// bad
if (strlen($myString) > 10 && strlen($myString) < 20) {}
// good
$length = strlen($myString);
if ($length > 10 && $length < 20) {}
?>
שליטה במשפטי if-else חיונית לבניית יישומי PHP דינמיים המבוססים על החלטות ותנאים שונים. על ידי הבנה טובה של עבודה עם תנאי if-else וביצוע שיטות עבודה מומלצות, ניתן ליצור קוד PHP חזק, קריא ויעיל. לעיתים, מוטב לעצור שניה את הפיתוח ולשקול ביצוע אופטימיזציה של לוגיקה מסורבלת, דבר שיכול לחסוך הרבה מאוד זמן עבודה בהמשך.