רמז לסוג סקלרי ב-PHP7 וסוגים מוחזרים
כולם יודעים ששפת ה-PHP היא שפה שמאופיינת בהיותה loose typing,ולכן לא צריך להגדיר לפונקציה את סוג הנתונים שהיא צריכה לקבל (מחרוזת, מספר, בוליאני). אם כי, ב-PHP גרסה 5 יש אפשרות לעשות type hinting , ולהגדיר למשתנה שישתייך לטיפוס מערך (array) או לאובייקט מסוים.
לדוגמה, הפונקציה הבאה מצפה לקבל פרמטר מסוג מערך בלבד:
function genertatFullName(array $user)
{
return $user['first_name'] . ' ' . $user['last_name'];
}
והפונקציה הבאה, מצפה לקבל אובייקט ששייך למחלקה או ל אינטרפייס User בלבד:
function genertatFullName(User $user)
{
return $user->firstName . ' ' . $user->lastName;
}
רמז לסוג סקאלרי ב-PHP גרסה 7
ב-PHP7 אפשר לבחור להגביל את סוג הנתונים המועברים לפונקציות ולמתודות גם לטיפוסים הסקאלריים.
כדי להגביל את הפונקציות לקבל משתנה מספרי בלבד משתמשים ב- type hinting (רמז לסוג) int:
function addOne(int $number)
{
return $number+1;
}
ועכשיו אם ננסה להעביר לפונקציה מחרוזת אנו עלולים לקבל שגיאה.
לדוגמה:
addOne('literal string');
יגרום לשגיאה הבאה:
Fatal error: Uncaught TypeError: Argument 1 passed to addOne() must be of the type integer, string given
ומצד שני, אם ננסה להעביר משהו ש-PHP יכול להפוך למספר, זה לא יגרום לשגיאה. לדוגמה, ננסה להעביר את המחרוזת '1':
addOne('1');// 2
וזה לא יגרום לשגיאה.
כדי לגרום למערכת להיות strict לגמרי, אנחנו צריכים להגדיר ל-PHP שאנחנו מצפים להקפדה מלאה על טיפוסי הנתונים המועברים לפונקציות באמצעות ההצהרה הבאה:
declare(strict_types=1);
לדוגמה:
declare(strict_types=1);
function addOne(int $number)
{
return $number+1;
}
addOne('1');
ועכשיו נקבל את השגיאה, כי אנחנו מנסים להעביר מחרוזת, והפונקציה מצפה לערך מספרי.
טיפוסים סקלאריים נוספים שניתן לעשות להם רמז לסוג ב-PHP7
מלבד לטיפוס integer ניתן לעשות type hinting גם לטיפוסים בוליאני ומחרוזת. כפי שאפשר לראות בטבלה הבאה:
סוג הנתונים | רמז לסוג |
---|---|
מספר שלם | int |
מספר עשרוני | float |
בוליאני | bool |
מחרוזת | string |
אילוץ סוגי המשתנים שמוחזרים מפונקציות ומתודות באמצעות return type declarations
כפי שניתן לאלץ את הפונקציות לקבל נתונים מטיפוס מסויים בלבד, PHP7 מביא איתו תכונה חדשה שמאפשרת למתכנתים לאלץ את הפונקציות והמתודות להחזיר נתונים מטיפוס מסויים בלבד. .return type declarations עושים זאת באמצעות
בדוגמה הבאה, נאלץ את הפונקציה להחזיר מספרים שלמים בלבד.
function addOne(int $number):int
{
return $number+1;
}
addOne(1);
כפי שניתן לאלץ את הפונקציות והמתודות להחזיר ערכים מטיפוס סקאלרי מסויים דוגמת מספר שלם או בוליאני, ניתן לאלץ את הפונקציות להחזיר טיפוסים מורכבים, דוגמת מערך או אובייקט.
בדוגמה הבאה, המתודה make יכולה להחזיר אובייקטים שנוצרים מהמחלקה A בלבד.
class A {}
class B {
function make():A
{
return new A;
}
}
זה יכול להיות שימושי במיוחד כשרוצים להגדיר את טיפוס הנתונים המוחזר ממתודה באמצעות interface. בדוגמה הבאה, ה-interface מגדיר לפונקציה make שהיא יכולה להחזיר אובייקטים מסוג A בלבד.
interface i {
function make():A;
}
class A {}
class B implements i {
function make():A
{
return new A;
}
}
// Test
$b = new B;
var_dump($b->make());
שימו לב, שכמו בפרמטרים, כשאנחנו מגדירים את הסוג המוחזר ב-interface, עלינו לחזור ולעשות זאת במתודה.
למה צריך את זה בכלל?
השאלה מדוע צריך רמז לסוג סקלרי ב-PHP, ועוד יותר מכך מדוע צריך להכריז על טיפוס הנתונים המוחזרים, היא במקום, היות ו-PHP ידועה בתור שפה מקלה, שבה לא צריך להגדיר את סוג הנתונים, והודות לכך כתיבת והבנת הקוד הופכת לפשוטה יותר. מצד שני, ישנם מתכנתים שבאים משפות נוקשות יותר, דוגמת Java ו-C, שרגילים להגדיר את סוג הנתונים המועברים לפונקציה. לפיכך, ההחלטה של הצוות שמפתח את PHP לאפשר, למי שמעוניין בכך, להשתמש ברמז לסוג סקאלרי נועדה לרצות את שתי האסכולות התכנותיות, כשכל אחד יכול לבחור את הסגנון הרצוי לו.
אני ממליץ ללמוד
PHP
מונחה עצמים עם
"The essentials of Object Oriented PHP"
שהוא הספר שעליו מבוססים רוב המדריכים בנושא באתר רשתטק.
הקליקו על התמונה כדי לרכוש את ה-eBook:
לכל המדריכים בנושא של PHP מונחה עצמים
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.