أمثلة على استخدام مساحة الاسم في PHP. وأوضح مساحات الأسماء في PHP. مساحة الاسم العالمية


  • ترجمة
  • درس تعليمي
ملاحظة لكل: أعلم أنه في وقت الترجمة كان الإصدار الحالي من PHP هو 5.5، كما أن هناك كتابًا يدويًا حكيمًا. لكنني وجدت أنه من المثير للاهتمام كيف يقدم المؤلف وظيفة مساحة الاسم، وربما تساعد هذه المقالة بعض أولئك الذين يتعلمون الأساسيات للتو (وليس الآخرين فقط، فهناك العديد من المطورين الملتحين الذين استقروا على PHP 5.2). هودور.

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

في PHP، لا يمكن أن يكون لديك فئتين تحملان نفس الاسم، يجب أن تكون جميعها فريدة من نوعها. المشكلة في هذا القيد هي أنه إذا كنت تستخدم مكتبة جهة خارجية تابعة لشخص آخر توفر فئة تسمى User، فلن تتمكن من إنشاء فئة خاصة بك تسمى أيضًا User . هذا أمر سيء حقًا، لأن المستخدم اسم مناسب جدًا للفصل الدراسي، أليس كذلك؟

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

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

مساحة الاسم العالمية

إليك فئة بسيطة جدًا:
لا يوجد شيء مميز كما ترى، وإذا كنت تريد استخدامه، فما عليك سوى القيام بذلك:
ديل، أنا أعرف نوعاً ما لغة PHP...

حسنًا، حسنًا، آسف. النقطة المهمة هي أنه يمكننا التفكير في هذه الفئة على أنها موجودة في مساحة الاسم العالمية. لست متأكدًا تمامًا من أن هذا هو المصطلح الصحيح، لكنه يبدو مناسبًا تمامًا بالنسبة لي. في الواقع، هذا يعني أن الفصل لا ينتمي إلى أي حزمة، بل فئة عادية فقط.

سهولة استخدام مساحات الأسماء

لنقم بإنشاء Eddard آخر، بجانب العالمي.
لدينا هنا فئة مشابهة جدًا مع تغيير بسيط، وهو إضافة توجيه مساحة الاسم. مساحة اسم السلسلة ستارك؛ يخبر PHP أننا نعمل في مساحة اسم Stark وأي كود (يعلن عن الفئات والوظائف والمتغيرات وما إلى ذلك) سيشير إليها.

لذا، نحن بحاجة إلى إنشاء Edd جديد، إذا قررت أنه يجب القيام به على النحو التالي:
لذلك لا، هذا ليس صحيحا. هنا نحصل على مثيل للفئة من المثال الأول الذي أنشأناه سابقًا. ليست تلك الموجودة في مساحة اسم Stark. دعونا نحاول إنشاء مثيل لـ Eddard Stark.
لإنشاء مثيل لفئة، نحتاج إلى بادئة اسم الفئة ببادئة من مساحة الاسم التي ينتمي إليها الفصل، واستخدامها كمحدد شرطة مائلة عكسية. ونتيجة لذلك، لدينا مثيل للفئة التي نحتاجها بالضبط. أليست سحرية؟

بالمناسبة، يمكن أن تشكل مساحات الأسماء تسلسلًا هرميًا معقدًا بشكل عشوائي، وذلك باستخدام العديد من المستويات حسب الحاجة. على سبيل المثال:
This\Namespace\And\Class\Combination\Is\Silly\But\Works

نظرية النسبية

تذكر كيف أخبرتك أن PHP تعمل دائمًا بالنسبة لمساحة الاسم الحالية. دعونا نلقي نظرة على هذا في العمل:
من خلال إضافة توجيه مساحة الاسم، فإننا نسمح لـ PHP بمعرفة أننا في مساحة الاسم Stark. نظرًا لأننا حددنا فئة Eddard فيه، فهذا هو بالضبط ما سنحصل عليه. انظر - كل شيء نسبي.

الآن بعد أن قمنا بتغيير مساحة الاسم، لدينا مشكلة واحدة صغيرة. هل لديك أي فكرة عما أتحدث عنه؟ الآن كيف نحصل على فئة إدارد الأصلية؟ حسنا، واحد في الفضاء العالمي؟

لحسن الحظ، PHP لديها خدعة تسمح لنا بحل هذه المشكلة - ببساطة عن طريق إضافة \ إلى اسم الفئة.
عند رؤية الشرطة المائلة الأولى، تدرك PHP أننا بحاجة إلى النظر إلى ما هو أبعد من مساحة الاسم الحالية وإنشاء مثيل للفئة التي نحتاجها.

الآن استخدم خيالك. تخيل أن لدينا فئة من مساحة اسم مختلفة تسمى Tully\Edmure. الآن نحن بحاجة لاستخدامه داخل مساحة ستارك. وكيف نفعل ذلك؟

مرة أخرى، كان علينا استخدام شرطة مائلة عكسية للانطلاق إلى العالمية قبل إنشاء مثيل للفصل في مساحة Tully.

بشكل عام، الإشارة إلى فئات من مساحات أسماء أخرى مثل هذه، باستخدام التسلسل الهرمي الكامل في الاسم، يمكن أن تكون مملة للغاية. ولكن لحسن الحظ، هناك خيار لإنشاء اختصار، دعونا نلقي نظرة:

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

أوه، خدعة صغيرة أخرى! يمكننا إعطاء ألقاب الفصول المستوردة لدينا:
باستخدام الكلمة الأساسية as، قمنا بإعطاء فئة Tully/Brynden الاسم المستعار Blackfish، والذي يسمح لنا باستخدام اللقب الجديد للتعرف عليه في مساحة الاسم الحالية. ذكي، أليس كذلك؟ يعد هذا أيضًا مناسبًا جدًا إذا كنت بحاجة إلى استخدام فئتين يحملان نفس الاسم داخل نفس مساحة الاسم:

من خلال إعطاء Daenerys من مساحة Dothraki لقب Khaleesi، يمكننا استخدام كلا فئتي Daenerys. مريحة للغاية، حيث يمكننا استخدام جميع الفئات الضرورية في تطبيقنا.

بناء

يمكن أن تساعدنا مساحات الأسماء أيضًا في تنظيم الكود الخاص بنا. اسمحوا لي أن أظهر.

لنفترض أنني أريد إنشاء مكتبة مفتوحة المصدر. أحب أن يتمكن الآخرون من استخدام الكود الخاص بي، سيكون ذلك رائعًا! المشكلة هي أن أسماء الفئات في الكود الخاص بي تتعارض مع تطبيق المستخدم الخاص بمكتبتي. سيكون غير مريح للغاية. هذه هي الطريقة التي سأحل بها هذه المشكلة:
Dayle\Blog\Content\Post Dayle\Blog\Content\Page Dayle\Blog\Tag
لقد استخدمت اسمي هنا لإظهار أن الرمز يخصني ولفصل الرمز الخاص بي عن رمز مستخدم مكتبتي. ضمن مساحة الاسم الأساسية، قمت بإنشاء بنية فئة وفقًا لتسلسلها الهرمي.

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

عيوب

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

والحقيقة هي أنه في اللغات الأخرى يتم تنفيذ وظيفة مساحات الأسماء بطريقة مماثلة، وفي الوقت نفسه توفر اللغات وظائف إضافية للتفاعل مع مساحات الأسماء.

في Java، على سبيل المثال، يمكنك استيراد فئات متعددة إلى مساحة الاسم الحالية باستخدام عبارة الاستيراد. في Java، يكون الاستيراد مشابهًا للاستخدام ويستخدم النقاط لفصل مساحات الأسماء (أو الحزم) المتداخلة. هنا مثال:
import dayle.blog.*;
سيؤدي هذا إلى استيراد جميع الفئات الموجودة في حزمة "dayle.blog".

لا يمكنك القيام بذلك في PHP. يجب عليك استيراد كل فئة على حدة. آسف. في الواقع، لماذا أعتذر؟ تفضل بتقديم شكوى إلى فريق تطوير PHP، لكني أطلب منك أن تكون مهذبًا. لقد فعلوا الكثير من الأشياء المثيرة للاهتمام مؤخرًا.

إليك خدعة رائعة للتخفيف من حدة المشكلة قليلاً. تخيل أن لدينا هيكل الفصل من المثال السابق. يمكننا أن نأخذ جزءًا من الفضاء الفرعي ونعطيه اسمًا مستعارًا.
يمكن أن يكون هذا مفيدًا عند استخدام عدد كبير من الفئات. جيد للجميع!

سأقبل بكل سرور جميع الرغبات والاقتراحات في رسالة شخصية، شكرًا لك.

يحدد المتغير قيمة، ولكن يمكن أن يكون مرجعًا لمتغير آخر وله قيمته. أثناء تنفيذ الخوارزمية، عادة ما يأخذ المتغير العديد من القيم المختلفة. الثابت يخزن قيمة واحدة فقط. الكائن لا يمكن التنبؤ به: فهو يميل إلى أن يكون له هيكل ومحتوى والعديد من الميزات.

مساحة الاسم عبارة عن مجموعة من المتغيرات والثوابت والكائنات والوظائف والبنيات الأخرى التي أنشأها المطور والتي يمكن الرجوع إليها من خلال اسم مساحة الاسم هذه.

الأسماء: مجال وصف البيانات والخوارزميات

أسماء العناصر (المتغيرات والثوابت والكائنات والوظائف وغيرها من بنيات المطور) لا تتقاطع أبدًا. تفسر PHP أي مطابقة للاسم على أنها خطأ جسيم، وفي الحالات التي لا يمكنها فيها تحديد المشكلة بوضوح، يتلقى المطور تعليمات برمجية لا تعمل على النحو المنشود، أو مربعًا أبيض في المتصفح.

يجب أن تكون كافة أسماء جميع البيانات فريدة لأن المساحة عامة. يجب أيضًا عدم تكرار أسماء الكائنات والوظائف، ولكن يتم مقاطعة نطاق الرؤية العالمية في أجسام الطريقة للكائنات والوظائف. لديها مساحة اسم محلية خاصة بها ولا شيء يمنعك من تسمية شيء ما داخليًا بنفس الطريقة التي تم تعيينه بها خارجيًا.

المثال أعلاه كلاسيكي، إذا لم تنتبه إلى الكلمة الأساسية لمساحة الاسم: كل شيء كما هو الحال دائمًا. والثاني يشمل الأعمال. تحدد البادئة NameSpaceTwo\ قبل أسماء الوظائف الإدخال الذي تم أخذ الكود منه.

إذا قمنا بإزالة الكلمة الأساسية العامة والعملية من الوظيفة الأولى $iExt = 1; انتقل إلى السطر أعلاه، فلن تعرف الدالة الأولى ولا الثانية قيمة المتغير 100.

مساحات الأسماء: نطاقات متعددة من الوصف

يحتوي المثال الموضح على ملف مشترك يستخدم إدراجين. يحتوي كل إدراج على نفس الدالة scCheckName(). يتم تحديد الخيار الذي سيتم اختياره بواسطة المبرمج باستخدام اسم المساحة ذات الصلة في الوقت المناسب في المكان المناسب في الكود.

حقيقة وجود نفس الاسم في الكود العام (بعد دمج الإدخالات) لا تؤدي إلى خطأ لسبب بسيط وهو أن كل ملف إدراج يتم تمييزه باسم فريد خاص به.

في الملف الأول، كل ما سيتم وصفه فيه مرتبط بالاسم NameSpaceOne. وفي الملف الثاني، سيتم ربط جميع الأوصاف بالاسم NameSpaceTwo.

يُسمح بأي تكرار للأسماء في كلا الملفين، ولكن في كل منهما، يجب أن يكون اسم أي عنصر (متغير، ثابت، كائن، وظيفة) فريدًا.

في هذا المثال، أدى تغيير اسم مساحة الاسم في استدعاء الدالة scCheckName() إلى منع تغيير المتغير $iExt الخاص بمساحة الاسم الثانية. ولهذا السبب تم تسليط الضوء بشكل خاص في المثال على كلمة "تم التغيير" - فالتغيير لم يحدث بالفعل. وتبقى قيمة المتغير كما هي.

الاختبار والتصميم المتعدد

توضح هذه الأمثلة البسيطة أنه يمكنك بسهولة تبسيط تطوير المشاريع المعقدة وزيادة الكفاءة والإنتاجية وتسريع العمل. من المؤكد أن الأفكار الأولى لاستخدام مساحات الأسماء ظهرت على الفور:

  • الاختبار الآمن للنصوص البرمجية - عن طريق استبدال مساحات "العمل" بنظائرها الاختبارية؛
  • تصميم آمن من قبل فرق كبيرة من المطورين - من خلال تزويدهم بمساحات "فردية" لوصف العناصر.

في الواقع، مساحة الاسم أكثر أهمية بكثير. لغة PHP ومساحة الاسم وكل عنصر من عناصر الوصف (متغير، ثابت، كائن...) زودت المطور منذ فترة طويلة بالقدرة على التعامل بشكل مستقل مع بناء الجملة والدلالات.

بنيات اللغة والقاعدة العامة للبرمجة الحديثة: "مفهوم" - منفذ - يوجد تناقض - "الشاشة البيضاء" ليس لها أي تأثير على المطور المحترف.

لا يعرف العديد من المبرمجين حتى مكان البحث عن رسالة خطأ PHP عندما لا يكون هناك شيء في المتصفح (مربع أبيض فارغ). في مرحلة معينة من تطوره، يفكر المبرمج في بناء الجملة ودلالات PHP، و"يعمل" تلقائيًا والنتيجة: بناء الجملة الخاص به ودلالاته الخاصة، في حدود ما هو مسموح به.

الشاشة البيضاء هي رد فعل فوري لا لبس فيه من مبرمج محترف ويتم التخلص من الخطأ. لماذا تضيع الوقت في مصحح الأخطاء وعرض سجل الأخطاء؟

الكائنات والمصفوفات ومساحات الأسماء

يمكنك القول أن المتغيرات والثوابت والدوال أصبحت شيئًا من الماضي، ولكنها تُستخدم في تصميم الكائنات. الكود الجيد هو عندما يتم تمثيل الخوارزمية من خلال كائنات متفاعلة، وليس من خلال سلسلة من التركيبات الصحيحة.

إذا كنت تستخدم مصفوفات من الكائنات، وتتعامل مع فكرة المكدس والعنصر الأخير (الأول) من المصفوفة، فيمكنك الحصول على ديناميكيات: الكائنات نفسها "تقرر" كيفية عمل وظائف الموقع اعتمادًا على الوضع الحالي .

في لغة PHP، مساحة الاسم هي نوع خاص من المتغيرات، يتم تمثيلها باسمها الفريد، والذي غالبًا ما يكون معقدًا. يتم استخدام اسم مساحة الاسم في التعليمات البرمجية. إذا كانت هذه سلسلة، فيمكنك استبدال مسافة بأخرى أثناء تنفيذ البرنامج النصي.

إذا كانت لغة PHP تستخدم أسماء مساحة الاسم كقيم متغيرة، فستكون هذه صياغة أكثر تحميلًا دلاليًا، وأقوى من صفائف الكائنات.

الكائن هو هيكل ومحتوى يتميز بالوحدة. مساحة الاسم هي مجموعة من الكائنات والعناصر والعلاقات فيما بينها.

ليس من الممكن إجراء تجارب على نظام قيد التشغيل، ولكن بفضل مساحة الاسم، توفر PHP القدرة على محاكاة نظام تشغيل حقيقي في مساحة مختلفة لأغراض:

  • مزيد من التطوير؛
  • اختبارات؛
  • الصيانة، الخ.

إذا استخرجنا من بناء الجملة الذي اقترحه مطورو PHP وتخيلنا مساحات الأسماء كأنظمة عالمية معقدة للكائنات، فإن آفاق الاحتمالات تتوسع عدة مرات.

بناء جملة مساحة الاسم واستخدامها

تقبل PHP مساحة الاسم فقط في السطر الأول من التعليمات البرمجية في كل ملف. يجب أن تتبعه جميع الأوصاف فقط. يتضمن بناء الجملة فقط الاسم المشار إليه بالمعنى المعتاد للاسم.

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

يمكن أن تتداخل المسافات إلى أجل غير مسمى، ولكن لا ينبغي الإفراط في استخدام ذلك. يجب أن يكون الاسم واضحًا، ويجب أن يكون التداخل مبررًا، ويجب أن يكون لتسلسل أسماء المسافات منطق.

في تطبيقات الاستخدام ومساحة الأسماء، تسمح لغة PHP بالترميز المعقد، ولكن كلما كان ذلك ممكنًا، فمن الأفضل استخدام الخيار البسيط.

القاعدة العامة هي: مساحة الاسم هي وصف وهذا ملف واحد، والاستخدام هو استيراد المساحة إلى برنامج الاستخدام وتعيين اسم مستعار (رابط قصير) لها.

مثال بسيط على فئات التحميل التلقائي (الكائنات)

تحتوي المهمة على كائن لمعالجة السلاسل، وأنماط عناصر الصفحة (أوصاف CSS)، وكائن التاريخ، وكائن نظام الملفات، وكائن قاعدة البيانات. الهدف من التنفيذ هو إنشاء واجهات بسيطة لهذه المواضع الخمسة من أجل استخدام القدرات اللازمة فقط من خلال أساليب هذه الكائنات.

لا يُسمح بالاستخدام المباشر لوظائف اللغة وبنياتها. تستخدم هذه المهمة التحميل التلقائي لفئة PHP. تعتبر مساحة الاسم بمثابة مجموعة من الكائنات الموجودة في موقع محدد في نظام الملفات. عادة، توجد جميع الكائنات في نظام الملفات حسب معناها، في المجلدات والملفات ذات الاسم المحدد.

يشير الرمز الموجود على اليسار إلى إنشاء الكائنات الخمسة المطلوبة، ولكن لا يتم تحديد موقعها بالضبط. يُظهر الكود الموجود على اليمين نص أداة التحميل التلقائي (البرنامج النصي الرئيسي)، والذي، عند تحميل الفئات (الكائنات)، يستبدل المسار المطلوب تلقائيًا بموقع الكائن وامتداد الملف .php.

مثال على مساحات الأسماء المتعددة

تعد مكتبة PhpOffice/PhpWord مثالاً جيدًا لاستخدام تسلسل هرمي معقد لمساحات أسماء متعددة. يحتوي مجلد العناصر تقريبًا على مجموعة كاملة من العناصر المتوفرة عند إنشاء مستند *.docx (MS Word)، وتحتوي المجلدات الأخرى على الأدوات اللازمة للعمل مع العناصر والفقرات والجداول.

في الواقع، تم وضع المكتبة في مجلد المشروع لأن مساحة وظائف PhpOffice / PhpWord تحتاج إلى استكمالها بأدوات محددة وإنشاء نسختك الخاصة من منتج مماثل في النهاية.

تحميل العديد من فئات مساحات الأسماء المختلفة

باستخدام التحميل التلقائي لمساحة اسم PHP، عندما يكون من الضروري تحميل العديد من الفئات، ويكون التسلسل الهرمي لنظام الكائنات المطور معقدًا للغاية ويصعب تخيله، يؤدي إلى الحاجة إلى إنشاء هياكل جامدة.

لا يمكن توجيه المطور (الذي يستخدم المنتج لمواصلة العمل) إلا في سياق الدلالات (فهم المشروع)، والتي تتمثل في مجموعات مناسبة من الكلمات التي تعكس المعنى الحقيقي والعلاقات بين الكائنات.

تؤدي الحاجة إلى استخدام المكتبة في مشروع فردي إلى حل مشكلة كيفية الجمع بين مساحات أسماء المطورين ومؤلفي PhpOffice / PhpWord. أفضل طريقة هي وضع هذا المنتج (مساحاته وأشياءه) في مساحة المشروع الخاصة به.

من المهم ملاحظة أنه لن يكون من الممكن الاستغناء عن تعديل مساحات الأسماء لهذا المنتج على مستوى عناصره المجردة وتحميل الفئة. يشير هذا إلى أن استخدام مساحات الأسماء الداخلية في مساحة الاسم PHP قد لا يكون تجريديًا وعالميًا بدرجة كافية.

نظام الملفات وتوطين المساحات

في الأساس، مساحات الأسماء هي "الخطوط العريضة" للمسار في نظام الملفات إلى الكائن المطلوب. يعد استخدام أسماء الملفات كأسماء كائنات أمرًا طبيعيًا وشائعًا. يعد استخدام أسماء المجلدات كتسمية مساحة الاسم أمرًا موضوعيًا.

يعد التنظيم "الخشبي" للمعلومات مرهقًا جدًا للاستخدام ويعقد عملية التطوير، ولكنه تمثيل طبيعي لأنظمة الكائنات.

تكمن المشكلة في أن مرحلة التطوير تتمثل في محرر أكواد محدد، يجمع بين التمثيل المرئي للمجلدات ومحتويات مجلد معين، ولكن لا يوجد محرر حتى الآن من شأنه أن يوفر حركة شاملة عبر الكائنات وعبرها. المجلدات.

مشكلة التجريد والعالمية

مقبولة بوعي المطور وهدفه في الواقع:

  • يوفر التجريد والقدرة على التعامل مع المعلومات وفقا لدلالاتها الحقيقية؛
  • تعكس مساحات الأسماء موضع البرامج النصية والكائنات وجزئيًا معنى المشروع في نظام الملفات

في الواقع، من خلال ربط تجريد OOP بأسماء الكائنات (الملفات) وتراكبها على نظام الملفات (المجلدات) مع تكوين مساحة اسم مناسب (مسارات + أسماء)، يمكنك التحكم في تكوين مساحات الأسماء أثناء تنفيذ البرنامج النصي.

لقد اكتسبت البرمجة بالفعل ديناميكية تطوير قوية، ولكن إذا نقلنا عملية وتحميل مرحلة التطوير من محرر النصوص (الذي يتم فيه إنشاء البرامج النصية ووضعها في أشجار المجلدات) إلى فكرة إنشاء كود يسمح بتحسين نفسه ووضعه في المكان المناسب في نظام الملفات - سترتفع البرمجة إلى آفاق جديدة.

لقد قمت مؤخرًا بتغليف مشروعي في مساحة اسم وواجهت مشكلة نقص الوثائق المناسبة. يعود كل ما تمكنا من العثور عليه إلى عام 2009 تقريبًا، وهو ما يقرب من عام 2012... في المادة التي تم العثور عليها، هناك الكثير من الأماكن غير العاملة التي تستخدم شيئًا غير موجود في الإصدار الحالي من php. وفي هذا الصدد، أود أن ألقي بعض الضوء على هذه المسألة.
إذًا، ما هي مساحة الاسم أو مساحة الاسم؟ وتعرفهم ويكيبيديا العظيمة على النحو التالي:

مساحة الاسم عبارة عن مجموعة، مما يعني نموذجًا أو تخزينًا مجردًا أو بيئة تم إنشاؤها للتجميع المنطقي للمعرفات الفريدة (أي الأسماء). يرتبط المعرف المحدد في مساحة الاسم بمساحة الاسم تلك. يمكن تعريف نفس المعرف بشكل مستقل في مسافات متعددة. وبالتالي، فإن القيمة المرتبطة بمعرف محدد في مساحة اسم واحدة قد (أو لا) لها نفس المعنى (أو مختلف إلى حد ما) مثل نفس المعرف المحدد في مساحة اسم أخرى. تحدد اللغات المدركة لمساحة الاسم القواعد التي تشير إلى مساحة الاسم التي ينتمي إليها المعرف (أي تعريفه).wiki

كله واضح؟ انها في الواقع بسيطة. قبل الإصدار 5.3، لم يكن هناك سوى مسافتين في PHP - العالمية (التي تم فيها تنفيذ التعليمات البرمجية الرئيسية الخاصة بك) والمحلية (حيث تم تعريف متغيرات الوظائف).

منذ الإصدار 5.3 تغير كل شيء. يمكنك الآن تحديد مساحة الاسم الخاصة بك والتي ستتواجد فيها فئاتك وأساليبك وما إلى ذلك.


آمل أن أصبح الأمر أكثر وضوحا قليلا.

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

من أجل استخدام الفئات المحددة في مساحة الاسم الخاصة بك، تحتاج إلى استيراد المساحة التي تحددها إلى المساحة العامة في المكان المناسب (عادةً ما أفضل القيام بذلك في بداية الملف، استخدم الكلمة الأساسية use).

انتباه:لسبب ما، لا يسمح PHP باستخدام الكلمة الأساسية يستخدمفي حالة الكتل والحلقات

لنأخذ المثال من الصور وننفذه بالكود:

انتباه:يجب أن تكون الكلمة الأساسية لمساحة الاسم موجودة في بداية الملف، مباشرة بعد ذلك
ملف A.php
ملف B.php
بناء جملة بديل ممكن:
يوصى بإعلان كل مساحة اسم في ملف منفصل. على الرغم من أنه من الممكن في واحدة، فإنه لا ينصح به على الإطلاق!
الآن دعنا ننتقل إلى الملف الثالث، حيث سيعمل البرنامج النصي الرئيسي لدينا
Index.php
يبدو أن هذه ميزة، تتم إضافة المزيد من التعليمات البرمجية فقط، ولكن هذا ليس صحيحا تماما، وسأقدم مثالا لفئة التحميل التلقائي، حيث ستكون الخطوط التي تربط الملفات بالفئات غير ضرورية.
الآن دعونا نلقي نظرة على فصولنا.

انتباه:باستخدام عامل دقة النطاق (::) في مساحات أسماء PHP غير مسموح! الشيء الوحيد المناسب له هو الوصول إلى أساليب وثوابت الفئة الثابتة. في البداية أرادوا استخدامه لمساحة الاسم، لكنهم قرروا عدم استخدامه بسبب المشاكل التي ظهرت. لذلك، بناء مثل A::A::say(); غير صالح وسيؤدي إلى خطأ.

بالنسبة لمساحات الأسماء، يجب عليك استخدام حرف الخط المائل العكسي "\"
انتباه:لتجنب سوء الفهم، من الضروري الهروب من هذا الحرف عند استخدامه في السلاسل: "\\"

يمكن أن تتداخل مساحات الأسماء داخل بعضها البعض، فلنضفها إلى ملف A.php الخاص بنا:
وسنكتب في الفهرس ما يلي:

هناك نقطة مهمة وهي استخدام الأسماء المستعارة للمسافات المستوردة. يمكنك كتابة A\subA::say(); ستوافق على أنه من الصعب كتابة مسارات كاملة للمسافات في كل مرة؛ ومن أجل تجنب ذلك، تم تقديم الأسماء المستعارة. عند الترجمة، سيحدث ما يلي: بدلاً من الاسم المستعار sub، سيتم استبدال A\subA، لذلك سنتلقى الاستدعاء A\subA::say();

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

لتجنب مشاكل التحميل التلقائي للفئات من المسافات، يجب تنظيم نظام الملفات بشكل مشابه لتنظيم المسافات. على سبيل المثال، لدينا فئات المجلد الجذر، حيث سيتم تخزين فئاتنا، ثم يمكن تنظيم مساحاتنا على النحو التالي
classs\A\A.php
classs\A\sub\A.php (سيتم وضع مسافة فرعية في ملف منفصل)
classs\B\B.php

لدى PHP ثابت سحري __NAMESPACE__ والذي يحتوي على اسم المساحة الحالية.

والآن عن التحميل التلقائي.

الفصل أدناه ليس خاصًا بي، لقد نجحت للتو في تحسينه وتحسينه قليلاً، مأخوذ من هنا.
انتباه:لكي يتم تحميل الفصول الدراسية الخاصة بك، يجب أن يتطابق اسم الفئة مع اسم الملف!

"ملف .$." in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); استراحة ) Autoloader::recursive_autoload($file, $path2, &$flag); ) Closedir($handle) وظيفة ثابتة خاصة StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." / Log/Log.html"; $file = fopen($dir, "a"); قطيع($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y) له") ."

" .PHP_EOL));قطيع($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
إذا نظرت إلى أسماء الفئات التي يتم تحميلها، سترى أن كل فئة مسبوقة ببادئة من مساحة الاسم المحددة قيد الاستخدام. ولهذا السبب أوصي باستخدام موقع الملفات في الأدلة المشابهة لمساحة الاسم؛ وهذا يؤدي إلى تسريع عملية البحث إلى تكرار واحد أو اثنين.

الآن يمكن كتابة الفهرس الخاص بنا على النحو التالي:
سيتم الآن تحميل جميع الفئات والواجهات التي ستستخدمها تلقائيًا.

لتوضيح بعض القدرات الديناميكية للغة مع المسافات، دعونا نعلن عن فئة أخرى:
test.php

الفهرس.php
sayName("اختبار"); // أو يمكنك إجراء هذا الاختبار\sayName("test2"); // أو مثل هذا $obj::sayName("test"); // أو يمكنك إجراء هذا الاختبار::sayName("test2");

آمل أن تكون مقالتي مفيدة لشخص ما.

مرحبًا. في مقال اليوم سوف ننظر، ما هي مساحات الأسماء في PHP.

إذا كنت تستخدمه لفترة طويلة عفوًا، فمن المحتمل أنك واجهت موقفًا واجهت فيه فشلًا عند الاتصال بمكتبة تابعة لجهة خارجية نظرًا لأنك تستخدم بالفعل نفس أسماء الفئات في التعليمات البرمجية الخاصة بك كما هو الحال في المكتبة. يمكن أن يحدث هذا بشكل خاص إذا كنت تستخدم أسماء شائعة مثل "نموذج", "ديسيبل"وما إلى ذلك وهلم جرا. سأخبرك الآن بكيفية إصلاح هذا.

مساحة الاسم- هذا نوع من التخزين تم إنشاؤه للتجميع المجرد للمعرفات الفريدة (الأسماء).

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

لنقم بإنشاء ملف myclass.phpمع هذا المحتوى

مساحة الاسم my\oneProject;
فئة ماي كلاس ( )
?>

لقد قمنا هنا بإنشاء فئة في مساحة الاسم my\oneProject. بالمناسبة، تحتاج إلى كتابة الشرطة المائلة العكسية بالضبط. لا تخلط!

الآن في الملف Index.phpدعونا نكتب ما يلي

require_once("myclass.php");
$mc = new MyClass(); // خطأ: لم يتم العثور على الفئة
$mc = new my\oneProject\MyClass(); // كل شيء يعمل
?>

كما ترون، الآن ليس من الممكن إنشاء فصل دراسي مثل هذا، يجب عليك تحديده مساحة الاسمهو مستلق.

يمكننا تحديد عدة في وقت واحد مساحات الأسماءفي ملف واحد

مشروع مساحة الاسم؛

كونست CONNECT_OK = 1؛
اتصال الطبقة ( )
وظيفة الاتصال () ()

NamespaceAnotherProject;

كونست CONNECT_OK = 1؛
اتصال الطبقة ( )
وظيفة الاتصال () ()
?>

على الرغم من أن لدينا أسماء متطابقة تمامًا للفئات والوظائف والثوابت، فلن يكون لدينا تعارض في الأسماء، لأنه إنهم يكذبون في مساحات مختلفة.

يمكننا أيضًا استخدام بناء الجملة بين قوسين.

مشروع مساحة الاسم (

كونست CONNECT_OK = 1؛
اتصال الطبقة ( )
وظيفة الاتصال () ()
}

مساحة الاسم مشروع آخر (

كونست CONNECT_OK = 1؛
اتصال الطبقة ( )
وظيفة الاتصال () ()
}
?>

إذا قمت بدمج الكود في مساحة الاسم العالميةمع وجود تعليمات برمجية في مسافات أخرى، فسيتم استخدام بناء الجملة الذي يحتوي على أقواس فقط.

مشروع مساحة الاسم (

كونست CONNECT_OK = 1؛
اتصال الطبقة ( )
وظيفة الاتصال () ()
}

مساحة الاسم ( // الكود العالمي
session_start();
$a = المشروع\الاتصال();
صدى المشروع\الاتصال::start();
}
?>

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

لمعرفة مساحة الاسم التي تتواجد فيها حاليًا، يمكنك استخدام الثابت __مساحة الاسم__

مشروع مساحة الاسم؛
صدى """، __NAMESPACE__، """؛ // سيتم طباعة "المشروع"
?>

باستخدام هذا الثابت، يمكنك، على سبيل المثال، إنشاء الأسماء ديناميكيًا

مشروع مساحة الاسم؛

وظيفة بما في ذلك($classname) (
$a = __NAMESPACE__ . "\\" . $classname;
إرجاع $a جديد؛
}
?>

هذا كل شيء لهذا اليوم. يمكنك الحصول على مزيد من المعلومات والمعرفة العملية من خلال حضور الدورة