Namespaces נוספו בגרסא PHP 5.3, זה אולי אחד הדברים שגורמים לגרסא זו לקבל כל כך הרבה תשומת לב, הרי Namespaces הם לא דבר חדש בתחום שפות התכנות הם קיימות בשפות אחרות כבר שנים ורק לאחרונה הם הוצגו גם לשפה זו. בתרגום חופשי Namespace הוא “מרחב”, וככה גם נפנה אליו בפוסט זה. Namespace בעצם מאפשרים למפתח להפריד את הקוד למודלים או קבוצות אשר גורם לקוד להיות יותר קריא. מרחבים מונעים התנגשויות בין שמות מחלקות ופונקציות, זה מאפשר שימוש במספר מחלקות בעלות אותו השם, כל זמן שהם נמצאים תחת מרחב שונה. מרחב גם גורם לסגנון הישן של שמות המחלקות ב Zend/Pear מיותר (Zend_Database_Mysql_Query) מאחר ולא יהיו יותר התנגשויות בין שמות המחלקות.

הבסיס

בכדי להגדיר מרחב פשוט צריך להשתמש במילה ‘namespace‘ ולאחר מכן את שם המרחב בו אתם רוצים לעשות שימוש. ניתן להגדיר תת-מרחב על ידי שימוש בסלאש (\). הנוהל בדרך כלל הוא שנתיב המרחב צריך להיות תואם לנתיב של התיקיה. לדוגמא, בקובץ Framework/Database/Mysql/Query.php/ המרחב צריך להיות מוגדר כ Framework\Database\Mysql ושם המחלקה צריך להיות Query. כמו כן רצוי שיהיה מרחב אחד ומחלקה אחת בכל קובץ.

שימוש ב Namespace

נניח וישנו את הקובץ lib/myClass.php/ אנו מגדירים בקובץ זה מרחב בשם lib ומגדירים מחלקה בשם myClass. בקובץ ה index.php אנו מוסיפים את המחלקה ויוצרים אובייקט שלה. מאחר ו myClass נמצאת תחת המרחב lib, אנו חייבים להתייחס אל המחלקה כ lib\myClass, ולא סתם myClass כמו שבדרך כלל היינו עושים.  ישנה אופציה חלופית לקבלת שמות המחלקות במרחב היא להשתמש במילה ‘use‘. על ידי הגדרת אילו מחלקות אתם ’משתמשים’ (using) בהם בתחילת הסקריפט ניתן בקלות לצפות בקוד ולהבין אילו תלויות ישנם עבור כל עמוד. לדוגמא use foo as bar . זה בעצם משנה את שמה של המחלקה foo ל bar. יהיה צורך לבצע זאת במידה והנכם משתמשים (use) במחלקות בעלות אותו השם (אך תחת מרחב שונה). אחרת יווצרו שגיאות הנגרמות כתוצאה מהשם הזהה.

הקובץ lib/myClass.php/

namspace lib;
class myClass
{
    public function foo()
    {
        echo 'hello world';
    }
}

הקובץ index.php

require 'lib/myClass.php';

//Error, Class not found.
$bar = new myClass();

//Displays hello world on the screen.
$bar = new lib\myClass();
$bar->foo();

//Displays hello world on the screen
use lib\myClass;

$bar = new myClass();
$bar->foo();

//Displays hello world
use lib\myClass as newName;

$bar = new newName();
$bar->foo();

יישום Autoloader

במקום לנסות ולהוסיף כל קובץ שאתה חושב יעשה בו שימוש בסקריפט, ניתן ליישם את מתודת ה autoloader__, מתודה זו רצה בכל פעם שמנסים ליצור אובייקט ממחלקה שלא נוספה עדיין ולא נמצאה, במקרה כזה הפוקנציה נכנסת לפעולה ובתוכה ניתן להוסיף את הלוגיקה שבעצם בצורה דינאמית מוסיפה את המחלקה הרצויה. במתודה שלנו אנו יכולים “לתרגם” שם מחלקה שנמצא תחת מרחב לקובץ שאנו נרצה להוסיף אותו לסקריפט. נניח ואני כן עוקבים אחר הנהלים של מיפוי מרחבים לתיקיות שדנו קודם זה יהיה די פשוט.

function __autoload($class)
{
    $file = str_replace('\\', '/', $class) . '.php';
    if(file_exists($file))
    {
        require $file;
    }
}

אז אם היינו קוראים למחלקה:

$db = new \Zend\Database\Mysql\Query();

המתודה היתה נכנסת לפעולה ומוסיפה את הקובץ Zend/Database/Mysql/Query.php (במידה ועקבתם אחר הנהלים) תמצא מחלקה בשם Query.

מחלקות פנימיות

מחלקות אשר הם חלק מ PHP לא נמצאות. בקוד שכבר כתבת יהיה צורך להשתמש במחלקות של PHP כמו, Exception, StdClass, Mysqli ואחרים. בעת העבודה עם מרחבים יש לזכור לתת קידומת של סלאש (\) למחלקות אלו כדי להשתמש במחלקה מהמרחב הראשי, שהוא ספרית ה-PHP – ולא מתוך אחד מהספריות שלכם הנמצאים במרחב שהגדרתם אשר נקראים באותו השם כמחלקות בסיסיות אלו.