OOP : והפעם interface ואיך משתמשים בזה
בהמשך לפוסטים בנושאי OOP השלב הבא הוא להבין מה זה interface, איך משתמשים ב interface ?
ולמה בכלל אני צריך את זה בקוד ?
ה interface נועד בעיקר לעשות סדר בקוד ולגרום למחלקות שונות לדבר באותה "שפה" מה הכוונה ?
בואו נקח דוגמה מהחיים האמיתיים מכשיר חשמלי , היום כל מכשיר חשמלי יודע להתחבר לחשמל , ויש לו 2 פונקציות בסיסיות הדלקה וכיבוי
אם אני אקח עכשיו ארון אני לא יכול לחבר אותו לחשמל וכמובן לא להדליק\לכבות אותו כי ארון לא יודע "לדבר" עם חשמל נכון ?
אז בואו נגדיר את הממשק של מכשירים חשמליים :
1 2 3 4 | interface ElectricalDevice{ public function power_on(); public function power_off(); } |
עכשיו בשביל לבנות מכשיר חשמלי הוא צריך לדבר בשפה של המכשירים החשמליים בשביל להכריח את מה שאנחנו בונים לדבר באותה שפה אנחנו פשוט מגדירים לו פונקציונאליות ככה :
1 2 3 4 | class Computer implements ElectricalDevice { // define ElectricalDevice... } |
עכשיו אם אנחנו נריץ את הקוד אנחנו נקבל את השגיאה הבאה :
1 | Fatal error: Class Computer contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (ElectricalDevice::power_on, ElectricalDevice::power_off) in |
למי שלא עקב השגיאה נראית לו מוזרה אבל השגיאה בעצם אומרת לנו שלא הגדרנו את 2 הפונקציות שחייבות להיות למחלקה בשביל שהיא תהיה "מכשיר חשמלי" או בקצרה , לא הגדרנו את הפונקציות power_on , power_off
ואם תגדירו זה יעבוד ה Computer יהפוך להיות מכשיר חשמלי..
מובן ? יופי
עכשיו אתם בטח שואלים למה אתם צריכים את זה הנה דוגמא מהעולם האמיתי של הפיתוח
נניח שאנחנו מפתחים מערכת מסויימת ומאפשרים לאנשים אחרים לפתח פלאגינים למערכת , אנחנו רוצים שכל הפלאגינים יהיו בעלי פונקציות מסויימות בשביל לא לשבור לנו את הקוד של המערכת אז אנחנו נעשה משהו כזה :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | interface SystemPlugins{ public function register_plugin($name); public function execute(); } class myCustomPulgin implements SystemPlugins { public $name; public function register_plugin($name){ $this->name = $name; }; public function execute(){ // dosomething here }; } |
ואז בשביל להפעיל כביכול את כל הפלאגינים שבמערכת (הפונקציה register_plugin אמורה לעשות הרבה יותר מאשר לשמור את השם , נניח להגדיר את ה name בתוך מערך גלובלי ששומר את הפלאגינים שיש למערכת*
אנחנו נעשה משהו בסגנון הזה
1 2 3 4 5 | $plugins = get_plugins(); // get all system plugins as objects foreach($plugins as $plugin) { $plugin->execute(); } |
זאת אומרת שעל ידי זה שהשתמשנו ב interface שנקרא SystemPlugins אנחנו יכולים להיות בטוחים שתמיד תהיה קיימת פונקצייה שנקראת execute שתריץ את הפעולות שהפלאגין אמור לעשות
וזהו
כמה הערות :
1. נניח שאנחנו רוצים להשתמש בכמה interface במקביל , כל מה שנצרך לעשות זה להשתמש בפסיק לדוגמא :
1 2 3 | class Computer implements ElectricalDevice , motherboard { //methods list here } |
2 . ה interface לא נועד להפעלת פונקציות אלא רק להגדיר את הפונקציות (מטודות) , בשביל להפעיל פונקציות יש לנו את abstract class אבל זה בעצם הפוסט הבא שיגיע ממש בקרוב.
מקווה שנהנתם ושהפוסט מובן , אם לא תשאלו חופשי.
הסבר נפלא וממצה. אני מכיר את הנושא כמובן אבל טוב לדעת שיש רפרנס אם פעם אשכח.
הקישור לפוסט פורסם בקבוצת המפתחים וכך גם כל פוסט שיפורסם מעכשיו והלאה. גם פרסמתי את הפוסט הקודם והפוסט הזה בטוויטר שלי ובפייסבוק. אם זה מה שיעודד אותך לכתוב – אז אין לי בעיה להמשיך