הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   תכנות - מדריכים, code snippets (https://hosts.co.il/forums/forumdisplay.php?f=68)
-   -   [מדריך] PHP - למתחיל בOOP. חלק ג' וד'. (https://hosts.co.il/forums/showthread.php?t=43174)

reXtea 09-04-07 18:11

[מדריך] PHP - למתחיל בOOP. חלק ג' וד'.
 
החלטתי לכתוב סדרת מדריכים בתכנות מונחה אובייקטים בשפת PHP על מנת לקדם מתחילים בשפה ולעזור להם להתפתח.

[*] המדריך נכתב על ידי אמיר פרידמן. אין להעתיק או לפרסם מדריך זה בשום מקום ללא אישור ממני באימייל: INvisioN.net@gmail.com. המדריך נכתב בלשון זכר אך מיועד גם למתוקות שקוראות מדריך זה =]

לבסוף היה לי המון זמן פנוי גם היום, אז החלטתי לכתוב את חלק ג' וד' היום D:

מומלץ לקרוא את חלק א' וב' לפני שתקראו את החלקים הבאים: http://www.hosts.co.il/forums/showthread.php?t=43115


חלק ג'. - הגבלת גישה למתודות ומאפיינים.
כאשר אתם יוצרים מחלקה, אתם יכולים לגשת למתודות ולמאפיינים שלה בקלות, אומנם לפעמים תרצו להגביל גישה מחוץ למחלקה למאפיין או למתודה כלשהי. ניקח לדוגמא את המחלקה הבאה:
PHP קוד:

class Fonts
{
    var 
$size "2";

    function 
set_size($size)
    {
        if (
$size 2) {
            
$this->size $size;
        } 
    } 
    function 
get_size()
    {
        return 
$this->size $size;
    } 


$Arial = new Fonts;
$Arial->set_size("3"); 

אומנם עשינו תנאי שבודק האם הגודל גדול מ2, רק אז תיתן לו לערוך את המאפיין, אבל יכלנו בקלות להוסיף בסוף את הקוד הבא:
PHP קוד:

$Arial->size "1"

אז הגענו למסקנה שאנחנו צריכים להגביל גישה אל אותו מאפיין מחוץ למחלקה, וכאן אנחנו צריכים להפוך את המאפיין לprivate - "פרטי" בתוך המחלקה.
אנחנו עושים דבר זה על ידי שימוש במאפייני הגישה הבאים:
  • public - ברירת המחדל שתמיד נמצאת במידה ולא הגדרת, נגיש בכל מקום.
  • private - פרטי, נגיש רק בתוך המחלקה ולא מחוצה לה.
  • protected - מוגן, נגיש לאותה מחלקה ולמחלקות שנגזרות ממנה בלבד.

כעת נגדיר את המאפיין size כפרטי על ידי שימוש במשפט - "private" בצורה כזאת:
PHP קוד:

    private $size "2"

וכעת, במידה וננסה לבצע את הקוד הזה:
PHP קוד:

$Arial->size "1"

מחוץ למחלקה, נקבל שגיאה.

כעת נשאלת שאלה? האם מתודות יכולות להיות גם פרטיות או מוגנות? כן.
עושים זאת בצורה הזאת:
PHP קוד:

    private function set_size($size

במידה וננסה לקרוא למתודה מחוץ מחוץ למחלקה, שגיאה תתקבל.

במידה ונשתמש בprotected, נוכל להשתמש במאפיינים ובתמתודות רק מתוך המחלקה הנוחכית ומהמחלקה הנגזרת ממנה ( הורשה ) -> על זה ננלמד בפרק ה'.

אז כאן מסתיים לו חלק ג',
כעת נעבור לחלק הבא.

חלק ד'. - בנאים.
הבנאי הוא מתודה בשם __construct, וכאשר יוצרים את האובייקט אפשר להעביר נתונים לבנאי, והסקריפט שיהיה בתוך המתודה של הבנאי ירוץ עם הגדרת האובייקט. ( זאת אומרת שלא נצטרך לקרוא לו על מנת שהוא יפעל, הוא יפעל אוטומטית ) בואו ניזכר באיך מגדירים אובייקט רגיל:
PHP קוד:

$variable = new class_name

נתחיל בדוגמא פשוטה על איך יוצרים בנאי, נשלב בנאי במחלקה הבאה:
PHP קוד:

class Fonts
{
    var 
$size;

    function 
__construct($size)
    {
            
$this->size $size;
    } 
    function 
get_size()
    {
        return 
$this->size $size;
    } 


למי שלא הבין, זה פשוט מאוד, פשוט בונים מתודה ששמה יהיה: __construtct, ומחליטים איזה ערכים היא תקבל.

כעת אנחנו נגדיר אובייקט למחלקה, אך כאשר אנחנו עובדים עם בנאים אנחנו צריכים להעביר נתונים לבנאי... במקרה שלנו את גודל הפונט ($size).
אנחנו נעשה את זה בצורה הזאת:
PHP קוד:

$Arial = new Fonts("3"); 

כעת המספר 3 מעובר למתודת הבנאי, והבנאי שלנו יכניס את המשתנה שהוא קיבל אל המאפיין size.

במידה וסיימתם לעבוד עם אובייקט מסויים או שאתם רוצים למחוק אותו, תוכלו להשתמש במשפט - "unset" בצורה כזאת:
PHP קוד:

unset $Arial

סוג נוסף של בנאי, הוא __destruct.
מתודות ה__destruct תפעל רק כאשר כל אזכור של המחלקה נעשה או שכבר האובייקט הושמד ( על ידי שימוש ב - "unset" ). לאחר שdestruct יפעל הוא ישמיד את המחלקה ( בדיוק כמו unset ).
PHP קוד:

class Fonts
{
    var 
$size;

    function 
__construct($size)
    {
            
$this->size $size;
    } 
    function 
get_size()
    {
        return 
$this->size $size;
    } 
    function 
__destruct() {
      die(
"Destroying the object");
 }


$Arial = new Fonts("3"); 

אז זהו, כאן מסתיים חלק ד' =]
מקווה שהחלק הזה של המדריך היה ברור והבנתם הכל = ]

בשבוע הבא נלמד על מתודות סטטיות ועל הורשה =]
אשמח לענות על כל שאלה בהודעה פרטית או במסנג'ר: INvisioN.net@gmail.com, או באימייל ( בדיוק כמו המסן ).

בהצלחה P:

חיים 09-04-07 18:35

אני חושב שיש לך טעות קטנה כי לפי מה שאני יודע פונקצייה בנאי קובעים עם אותו השם של המחלקה ולא עם השם שאתה אמרת זה נכון?או שזה אני טועה?

reXtea 09-04-07 19:02

לא זאת לא טעות, זה אפשרי ליצור מתודה בשם של המחלקה והיא כן תפעל כאשר נגדיר אובייקט אבל לא תוכל להעביר אליה נתונים...
זה הכל =]

חיים 09-04-07 19:04

אבל בכל האתרים של לימוד PHP כתוב ככה אתה יכול להסביר את זה?

בניה 09-04-07 19:17

ציטוט:

נכתב במקור על ידי INvisioN (פרסם 455779)
לא זאת לא טעות, זה אפשרי ליצור מתודה בשם של המחלקה והיא כן תפעל כאשר נגדיר אובייקט אבל לא תוכל להעביר אליה נתונים...
זה הכל =]

פונקצית הבנאי היא פונקציה בשם המחלקה ואוטומטית קוראים לה שיצרים אוביקט חדש וביצירת האוביקט שולחים אליה את הפרמטרים.
PHP קוד:

$x = new XYZ($arg1,$arg2); 


Eran-s 09-04-07 19:50

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

אך ב-PHP ניתן גם באמצעות איך שכותב המדריך ציין.

reXtea 09-04-07 20:05

ציטוט:

נכתב במקור על ידי Eran-s (פרסם 455828)
כמו שכבר ציינו פונקציה בנאית היא פונקציה בשם המחלקה, יש כמה סוגים כגון:
Default Constructor - פונקציה אשר לא מקבלת פרמטרים וקובעת פרמטרים שונים.
Constructor מפורש - מקבל את כל הפרמטרים הקיימים במחלקה ומעדכן אותם.

אך ב-PHP ניתן גם באמצעות איך שכותב המדריך ציין.

יאפ =] אני אישית משתמש משתמש לרוב ב__construct ... זה מאוד נחמד =]
ואממ אשמח אם תקרא לי אמיר במקום "כותב המדריך" XD =] :-D


כל הזמנים הם GMT +2. הזמן כעת הוא 07:56.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ