فضاء الأسماء (namespaces) في PHP – PHP

التصريح عن فضاء اسم

يُصرَّح عن فضاء الاسم كالتالي:

  • للتصريح عن فضاء الاسم MyProject نكتب الشيفرة التالية:
namespace MyProject;
  • للتصريح عن فضاء اسم متداخل نكتب:
namespace MyProjectSecurityCryptography;
  • للتصريح عن فضاء اسم مع أقواس مغلقة نكتب:
namespace MyProject { ... }

من الأفضل أن تصرّح عن فضاء اسم واحد في الملف بالرغم من أنّه يمكنك التصريح عن العدد الذي تريده من فضاءات الأسماء في ملف واحد:

namespace First {
    // First في فضاء الاسم A تعريف الصنف
    class A { ... };
}

namespace Second {
    // Second في فضاء الاسم B تعريف الصنف
    class B { ... }; 
}

namespace {
    // في فضاء الاسم الجذر  C تعريف الصنف
    class C { ... }; 
}

عندما تصرّح عن فضاء اسم فإنّ كل الأصناف التي تعرّفها بعده تنتمي إليه:

namespace MyProjectShapes;

class Rectangle { ... }
class Square { ... }
class Circle { ... }

يمكن أن يستخدم التصريح عن فضاء اسم عدة مرات في ملفات مختلفة، يعرّف المثال السابق ثلاثة أصناف في فضاء الاسم MyProjectShapes في ملف واحد لكن يُفضَّل أن يُقسم إلى ثلاث ملفات يبدأ كل منها بشيفرة فضاء الاسم MyProjectShapes.

الإشارة إلى صنف أو دالة في فضاء الاسم

يمكننا التعريف عن صنف في فضاء الاسم كما وضحنا في الفقرة السابقة بالشكل التالي:

namespace MyProjectShapes;
class Rectangle { ... }

نحتاج للحصول على المسار الكامل (المتضمن فضاء الاسم) للإشارة إلى هذا الصنف:

$rectangle = new MyProjectShapesRectangle();

يمكن أن نختصر الشيفرة السابقة باستيراد الصنف باستخدام التعليمة use:

// MyProjectShapesRectangle كنية Rectangle تصبح

use MyProjectShapesRectangle;
$rectangle = new Rectangle();

يمكنك بدءًا من الإصدار PHP 7.0 تجميع تعليمات use مختلفة في تعليمة واحدة مستخدمًا الأقواس:

use MyProjectShapes{
    // `use MyProjectShapesRectangle` نفس تعليمة
    Rectangle, 
    // `use MyProjectShapesCircle` نفس تعليمة
    Circle,
    // `use MyProjectShapesTriangle` نفس تعليمة 
    Triangle, 
    // التجميعية use يمكنك أيضًا استيراد فضاءات الأسماء الفرعية في تعليمة
    PolygonFiveSides, 
    PolygonSixSides
};
$rectangle = new Rectangle();

قد يكون لديك صنفين بنفس الاسم وهذه ليست مشكلة إذا كان كل منهما في فضاء اسم مختلف، لكن هذا قد يسبب مشكلة عند محاولة استيرادهما باستخدام تعليمة use:

use MyProjectShapesOval;
use MyProjectLanguagesOval;
// Error!

يمكنك حل هذه المشكلة بتعريف كنية باستخدام الكلمة المفتاحية as بالشكل التالي:

use MyProjectShapesOval as OvalShape;
use MyProjectLanguagesOval as OvalLanguage;

يجب الهروب بالمحرف للإشارة إلى صنف خارج فضاء الاسم الحالي وإلا سيُفترَض فضاء الاسم النسبي من فضاء الاسم الحالي:

namespace MyProjectShapes;

// (1)
$a = new Rectangle();

// (2)
$a = new MyProjectShapesRectangle();

// (3)
$a = new MyProjectShapesRectangle();

// (4)
$a = new StdClass();

// (5)
$a = new StdClass();

في الموضع (1) أُشير إلى MyProjectShapesRectangle بشكلٍ صحيح.

في الموضع (2) أُشير إلى MyProjectShapesRectangle بشكلٍ صحيح لكن لا يوجد ضرورة لذكر المسار الكامل.

في الموضع (3) أُشير إلى MyProjectShapesMyProjectShapesRectangle بشكلٍ خاطئ.

في الموضع (4) تتطلب الإشارة إلى الصنف StdClass من ضمن فضاء الاسم استخدام البادئة لأنّ هذا الصنف غير معرّف في فضاء اسم أي أنّه عام وهذه الطريقة الصحيحة للإشارة إليه.

في الموضع (5) أُشير إلى MyProjectShapesStdClass بشكلٍ خاطئ.

التصريح عن فضاء اسم فرعي

يمكننا التصريح عن فضاء اسم ضمن هرمية بالشكل التالي:

namespace MyProjectSubLevel;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

يُنشئ المثال السابق ما يلي:

constant MyProjectSubLevelCONNECT_OK
class MyProjectSubLevelConnection and
function MyProjectSubLevelconnect

ما هي فضاءات الأسماء؟

يوجد في مجتمع PHP الكثير من المطورين يكتبون الكثير من الشيفرات فمن الممكن أن يوجد نفس اسم الصنف في مكتبتين مختلفتين وقد يسبب هذا مشكلة عند استخدامهما في فضاء اسم واحد، لذا فإن فضاءات الأسماء تحلّ هذه المشكلة. كما هو موضح في دليل PHP المرجعي يمكن موازنة فضاءات الأسماء بمجلدات نظام التشغيل، فإذا كان لدينا ملفين بنفس الاسم موجودين في مجلدين مختلفين يشبه ذلك صنفي PHP لهما نفس الاسم وموجودين في فضاءي اسمين مختلفين.

من الضروري بالنسبة لك أن يُستخدم فضاء اسم شيفرتك من قِبل المطورين الآخرين دون الخوف من التصادم مع مكتبات أخرى.

ترجمة -وبتصرف- للفصل [Namespaces] من كتاب PHP Notes for Professionals book


Source link

اظهر المزيد
زر الذهاب إلى الأعلى

أنت تستخدم إضافة Adblock

الاعلانات هي مصدرنا الوحيد لدفع التكلفة التشغيلية لهذا المشروع الريادي يرجى الغاء تفعيل حاجب الأعلانات