DevTips - مساحات الأسماء في PHP

نشرت: 2020-03-06

منذ حوالي عام ، قرر WordPress تحديث الحد الأدنى المطلوب من إصدار PHP ، من 5.2 (مستخدم منذ 2010) إلى شيء أكثر حداثة. في الواقع ، يعد الإصدار الأدنى من PHP الموصى به من قبل WordPress اليوم واحدًا من أحدث إصدار: PHP 7.3.

إذا كنت مستخدم WordPress بسيطًا ، فربما لن يؤثر ذلك عليك كثيرًا (بخلاف حقيقة أن هذه الإصدارات الجديدة توفر أداءً أفضل).

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

ووردبريس وبادئات الكود

إحدى القواعد الأولى التي تتعلمها كمطور WordPress هي "استخدام البادئات في كل ما نقوم به" لتجنب "تضارب الأسماء". كما يمكننا أن نقرأ في أفضل ممارسات WordPress:

يحدث تضارب التسمية عندما يستخدم المكون الإضافي الخاص بك نفس الاسم لمتغير أو وظيفة أو فئة كمكوِّن إضافي آخر.

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

أفضل الممارسات لتطوير ملحقات WordPress

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

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

مساحات أسماء PHP

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

في أوسع تعريف لمساحات الأسماء هي طريقة لتغليف العناصر. يمكن اعتبار هذا مفهومًا مجردًا في العديد من الأماكن. على سبيل المثال ، في أي أدلة نظام تشغيل تعمل على تجميع الملفات ذات الصلة ، وتعمل كمساحة اسم للملفات داخلها. كمثال ملموس ، يمكن أن يوجد الملف foo.txt في كل من الدليل / home / greg و / home / other ، لكن لا يمكن أن تتواجد نسختان من foo.txt في نفس الدليل.

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

1. تضارب الأسماء بين التعليمات البرمجية التي تقوم بإنشائها ، وكود PHP الداخلي أو رمز جهة خارجية.

2. القدرة على الاسم المستعار (أو تقصير) Extra_Long_Names ، وتحسين إمكانية قراءة شفرة المصدر.

مستندات PHP

كيفية إنشاء مساحة الاسم

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

 <?php namespace Nelio_Content;

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

 <?php namespace Nelio_Content; function get_site_id() { // ... }

نحن نعلم الآن أن get_site_id موجود داخل مساحة الاسم Nelio_Content . بهذه الطريقة ، لم يعد علينا استخدام البادئة nelio_content_ عند تعريف الوظيفة. رائعة!

استثناءات مساحات الأسماء

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

تغطي مساحات أسماء PHP عناصر PHP التالية فقط:

  • الطبقات
  • واجهات
  • سمات
  • المهام
  • تم إعلان const ولكن ليس define

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

كيفية استيراد العناصر من مساحة اسم إلى أخرى

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

 <?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... }

يمكنك أن ترى أننا حددنا وظيفتين: get_site_id و get_auth_token ، كلاهما داخل مساحة الاسم Nelio_Content . عندما يحتاج get_auth_token إلى استخدام get_site_id ، فإنه يطلق عليه ببساطة كالمعتاد.

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

 <?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... }

أو يجب عليك استيراد الوظيفة use الكلمة الأساسية:

 <?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... }

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

مرشحات WordPress والإجراءات مع مساحات أسماء PHP

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

 <?php // ... add_action( 'init', 'do_some_action' );

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

هل تضيف الخطاف في الملف حيث تحدد مساحة الاسم نفسها؟ لا يهم ، استخدم الاسم الكامل:

 <?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' );

هل أنت في مساحة اسم أخرى ولكنك قمت باستيراد الوظيفة use ؟ لا يهم أيضًا ، استخدم الاسم الكامل:

 <?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );

استخدام الأسماء المستعارة مع مساحات الأسماء الخاصة بنا

وظيفة أخرى مثيرة للاهتمام لمساحات الأسماء هي الاسم المستعار. تخيل السيناريو التالي:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

إذا كنت أرغب في استخدام هذه الوظيفة في مساحة اسم أخرى ، فقد رأينا بالفعل أنه يمكنني القيام بذلك use . ولكن كيف يمكنني استخدام هذه الوظيفة إذا كانت الوحدة التي أرغب في استخدامها بها بالفعل وظيفة تسمى get_site_id ؟

حسنًا ، لحسن الحظ بالنسبة لي ، يمكننا تسمية وارداتنا بأسماء جديدة:

 <?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }

ابدأ في استخدام مساحات الأسماء اليوم!

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

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

صورة مميزة بواسطة Chaitanya Tvs على Unsplash.