اذهب إلى المحتوى

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


سارة محمد2

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

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

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

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

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

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

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

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

namespace MyProject\Shapes;

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

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

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

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

namespace MyProject\Shapes;
class Rectangle { ... }

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

$rectangle = new MyProject\Shapes\Rectangle();

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

// MyProject\Shapes\Rectangle كنية Rectangle تصبح

use MyProject\Shapes\Rectangle;
$rectangle = new Rectangle();

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

use MyProject\Shapes\{
    // `use MyProject\Shapes\Rectangle` نفس تعليمة
    Rectangle, 
    // `use MyProject\Shapes\Circle` نفس تعليمة
    Circle,
    // `use MyProject\Shapes\Triangle` نفس تعليمة 
    Triangle, 
    // التجميعية use يمكنك أيضًا استيراد فضاءات الأسماء الفرعية في تعليمة
    Polygon\FiveSides, 
    Polygon\SixSides
};
$rectangle = new Rectangle();

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

use MyProject\Shapes\Oval;
use MyProject\Languages\Oval;
// Error!

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

use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;

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

namespace MyProject\Shapes;

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

// (2)
$a = new \MyProject\Shapes\Rectangle();

// (3)
$a = new MyProject\Shapes\Rectangle();

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

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

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

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

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

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

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

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

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

namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

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

constant MyProject\Sub\Level\CONNECT_OK
class MyProject\Sub\Level\Connection and
function MyProject\Sub\Level\connect

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

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

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

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...