Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقدمة إلى مساحات الأسماء

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 10 من 91.

مع نمو مشاريع PHP الخاصة بك، ستنشئ العديد من class. ماذا يحدث عندما يكون لدى class وclass الاسم نفسه؟

على سبيل المثال، قد تكون لديك فئة User لمدونتك وفئة أخرى User لمتجرك. تحلّ مساحات الأسماء هذه المشكلة من خلال تنظيم الفئات في مجموعات منطقية.

مساحة namespace تشبه مجلدًا لفئاتك. تُعلن عنها في أعلى ملف PHP باستخدام الكلمة المفتاحية namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

يمكنك الآن امتلاك فئة User أخرى في مساحة أسماء مختلفة:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

لاستخدام class ذات namespace، تشير إليها باستخدام its full path عبر backslash:

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

المخرجات:

Alice
alice@example.com

يفصل \‏ backslash مستويات namespace، على نحو مشابه لفصل الشرطات المائلة للمجلدات في file path. يمكنك أيضًا إنشاء namespaces متداخلة مثل App\Models\Blog لتنظيم أعمق.

نقطة أساسية: تمنع namespace تعارضات التسمية وتحافظ على تنظيم شيفرتك. صرّح دائمًا عن namespace قبل أي شيفرة أخرى في ملفك (باستثناء عبارات declare).

challenge icon

التحدي

سهل

لننظّم تطبيقًا صغيرًا باستخدام مساحات الأسماء لمنع تعارضات التسمية بين الفئات التي تحمل الاسم نفسه.

تخيّل أنك تبني نظامًا يتعامل مع المركبات والحيوانات معًا. يحتوي كلا المجالين على كيان يُسمّى Car: يمثّل أحدهما سيارة فعلية، بينما الآخر قط أليف اسمه "Car" (نعم، بعض الأشخاص يسمّون قططهم بهذه الطريقة!).

ستُنشئ ثلاثة ملفات:

  • Vehicle/Car.php: عرّف فئة Car في مساحة أسماء Vehicle مع خاصية public $brand. يجب أن يقبل constructor اسم العلامة التجارية ويعيّنه. أضف طريقة describe() تُرجع "Vehicle: [brand]".
  • Animal/Car.php: عرّف فئة Car في مساحة أسماء Animal (هذا قط اسمه Car!). يجب أن تحتوي على خاصية public $age. يقبل constructor العمر ويعيّنه. أضف طريقة describe() تُرجع "Cat named Car, age: [age]".
  • main.php: ضمّن ملفّي الفئتين باستخدام require_once. أنشئ كائنًا واحدًا من كل مساحة أسماء باستخدام مسارات مساحات الأسماء الكاملة، ثم اطبع نتيجة استدعاء describe() على كل كائن (كل نتيجة في سطر مستقل).

في main.php، أنشئ:

  • كائن Vehicle\Car بعلامة تجارية "Toyota"
  • كائن Animal\Car بعمر 3

تذكّر استخدام الشرطة المائلة العكسية \ للإشارة إلى الفئات ذات مساحات الأسماء باستخدام مسارها الكامل عند إنشاء الكائنات.

جرّب بنفسك

<?php
// تضمين ملفات الفئات
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';

// TODO: أنشئ كائن Vehicle\Car بالعلامة التجارية "Toyota"
// تذكر استخدام مسار مساحة الاسم الكامل مع الشرطة المائلة العكسية

// TODO: أنشئ كائن Animal\Car بعمر 3
// تذكر استخدام مسار مساحة الاسم الكامل مع الشرطة المائلة العكسية

// TODO: اطبع نتيجة describe() لكل كائن (كل منها في سطر منفصل)

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت