PHP 5.3 - תוספות תחביר

עם כל השינויים המשמעותיים והתוספות ב PHP 5.3 ישנם כמה תוספות תחביר שמקלות ומאפשרות לכתוב את הקוד בצורה שונה, לפעמים גם יעילה יותר, ולפעמים גם קצרה יותר. סיקור קצר של כמה מתוספות התחביר ש PHP 5.3 מאפשרת, כמו: NOWDOC, Ternary Short Cut ‘?:’, Jump Label, ואת המתודה callStatic__.

NOWDOC


nowdoc דומה ל herdoc, אותם כללים תקפים גם ל nowdoc, עם הבדל קטן שאין צורך בלהבריח תווים או משתנים בתוך הבלוק של ה- nowdoc מאחר והוא לא מבצע שום עיבוד של משתנים בתוכו, בניגוד ל herdoc. דוגמא ל nowdoc:

1
2
3
echo <<<'END_OF_HTML'
$hello this is {$a->test}
END_OF_HTML;

בדוגמא למעלה הקוד ידפיס את התוכן הבא:

1
$hello this is {$a->test}

ללא המרכאות ( ‘ ) הוא יהיה בדיוק כמו herdoc ולכן יחזיר את הערכים שהוצבו למשתנים בתוך בלוק הקוד.

Ternary Short Cut


עד היום היה ניתן לבצע את הפעולה הבאה:

1
$value = $expression ? $trueValue : $falseValue;

זה היה מפשט מאוד את כתיבת הקוד במידה והיינו צריכים לכתוב פקודת if בקצרה על שורה אחת בלבד. ב PHP 5.3 נוספה האפשרות לתחביר אף יותר קצר, בניגוד לדוגמא למעלה (שאנו בודקים אם expression$ מחזיר ערך השווה ל true, במידה וכן אז הערך שמגיע אחרי הסימן שאלה יוצב למשתנה value$ במידה והמשתנה expression$ מחזיר ערך השווה ל false מה שמגיע אחרי הנקודותיים יוצב למשתנה value$) אנו יכולים יכולים לכתוב את אותו הקוד בצורה קצרה יותר:

1
$value = $trueValue ?: $falseValue;

בעצם אופן הפעולה הוא שבמידה והערך trueValue$ מחזיר ערך השווה ל true זה הערך שיוצב למשתנה value$, במידה ולא מה שמגיע אחרי :? שהוא בעצם המשתנה falseValue$ יוצב למשתנה value$. תוספת קטנה אך שוב, מקצרת לנו את הזמנים ונותנת לנו יותר גמישות בקוד.

(Jump Label (Go To


האופרטור goto ניתן לשימוש כדי לעבור (לקפוץ) אל חלק אחר בקוד. אותו מקום אליו אנו נעבור (או נקפוץ) מצויין על ידי תווית (מילה כלשהי) ולאחריו נקודותיים (:). ישנם מגבלות בשימוש עם goto. נקודת היעד צריכה להיות באותה הפונקציה/מתודה באותה המחלקה/קובץ, לא ניתן לקפוץ מקובץ לקובץ או מפונקציה/מתודה אל מחוצה לה, כמו כן לא ניתן לקפוץ אל תוך פונקציה או מתודה. בנוסף לכך אין אפשרות לקפוץ אל תוך לולאה כלשהי או פקודת switch, אך ניתן לקפוץ מחוץ לאלו, שימוש נפוץ ב goto יהיה במקום להשתמש בפקודת ;break x, כשה-x הוא ערך הגדול מ-1 מה שגורם ל break לצאת מיותר מלולאה אחת (או יותר מפקודת switch אחת).

דוגמא לשימוש

1
2
3
4
5
6
7
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>

הדוגמא למעלה תדפיס Bar.

callStatic


זהו אומנם לא אפשרות תחביר אלה חלק מה OOP של PHP, אבל בכל זאת נסקר אותה בקצרה. בעת הקריאה למתודה סטטית שאינה קיימת, בדרך כלל PHP יזרוק שגיאת FATAL ERROR, החל מ PHP 5.3 ניתן גם “לתפוס” קריאה למתודה סטטית ולעבד/לנתח אותה בצורה דינאמית. הפונקציה הזו היא זהה לפונקציה ()call , אשר ניתן להשתמש בה כדי לבצע פעולה מסויימת בעת הקריאה למתודה סטטית שאינה קיימת במחלקה, מונח זה גם נקרא <a href=” http://il2.php.net/ callstatic” target=”_blank”>overloading.

דוגמא קצת יותר ברורה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class MethodTest {
public function __call($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context'); // As of PHP 5.3.0
?>

הקוד למעלה יחזיר את התוצאה הבאה:

1
2
Calling object method 'runTest' in object context
Calling static method 'runTest' in static context

שוב, לא שיפור כל כך גדול, אבל לפחות כעת אפשר גם לתפוס מקרים בהם מנסים לקרוא למתודה סטטית שאינה קיימת במחלקה.

Share Comments