مساحات أسماء PHP في WordPress - دليل لا معنى له

نشرت: 2018-10-16

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

كانت مساحات أسماء PHP موجودة منذ عقد من الزمان ، وما زلت لا تستخدمها لأن #wordpress ليس كذلك؟ اقرأ وابدأ في استخدامها في دقيقتين! #تطوير

انقر على تويتر

عندما لا يكون هناك دعم لمساحة الاسم - استخدم بادئة

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

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

هناك بعض البدائل لهذا النهج مثل تغليف الطرق الثابتة. تقوم بتغليف جميع وظائفك في فصل دراسي وتعلن أنها طرق ثابتة. ثم بدلاً من استدعاء my_function() يمكنك استدعاء My_Class::my_function() . أفضل؟ قليلا ، ولكن لا يزال غير مناسب مسافة الأسماء.

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

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

التصريح عن مساحات الأسماء - تذكر السطر الأول

يجب أن تكون namespace الكلمات الرئيسية هي السطر الأول من التعليمات البرمجية في الملف (لا يتم احتساب التعليقات وأي محتوى بخلاف PHP). تؤثر مساحات الأسماء على الفئات والواجهات والوظائف والثوابت فقط. لا تؤثر على المتغيرات. يمكنك تحديد نفس مساحة الاسم في ملفات متعددة مما يسمح لك بتقسيم التعليمات البرمجية إلى ملفات متعددة. تسمح مساحات الأسماء الفرعية بتعريف تسلسل هرمي في مساحات الأسماء كما هو الحال في المجلدات باستخدام شرطة مائلة للخلف - namespace myproject\level1\level2 . هذه قواعد أساسية وجميع القواعد تقريبًا للتصريح عن مساحات الأسماء.

// file-A.php contains a function under the myCompany\PackageA namespace
namespace myCompany\PackageA;
 
function do_something() {
  // do things
}
// file-B.php contains a function with the same name
// but under a different namespace
namespace myCompany\PackageB;
 
function do_something() {
  // do things
}

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

// do not put multiple namespace declarations into the same file
// but if you must, here's the syntax

namespace MyFirstProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

namespace MySecondProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

// any code after this has to go in the global namespace
namespace {
  $some_var = 1;
  function_in_global_namespace();
}

استخدام مساحات الأسماء - تذكر المجلدات

كما قلت من قبل - مساحات الأسماء تشبه المجلدات إلى حد كبير. بافتراض أن الملف foo.txt موجود في مجلدك الحالي ؛ يمكنك الرجوع إليه باستخدام ملف foo.txt بسيط. إذا كنت فوق المجلد الذي يحتوي على ملف foo.txt بمستوى واحد ، فأنت بحاجة إلى استخدام مسار نسبي ../foo.txt أو مسار مطلق / مجلد 1 / مجلد 2 / /folder1/folder2/foo.txt . لا شيء يتوهم. تستخدم مساحات الأسماء نفس النموذج.

// remember after declaring a namespace
// all our code is in it; like when you're working in a folder
namespace mycompany\project;

function foo() {}
class foo {
  static function staticmethod() {}
}

// resolves to mycompany\project\foo() because of line #3
foo();

// likewise, resolves to mycompany\project\foo::staticmethod()
foo::staticmethod();

// constant are affected by namespaces too
// so we're working with mycompany\project\FOO
echo FOO;

// this is a relative path
// resolves to mycompany\project\subnamespace\foo()
subnamespace\foo();

// static methods are no different
// mycompany\project\subnamespace\foo::staticmethod()
subnamespace\foo::staticmethod();
                                 
// a full namespace path starts with a backslash
// it resolves exactly to what it says it does
\otherNamespace\Bar\foo();

// again same thing for a constant, full path nothing magical
echo \otherNamespace\Bar\FOO;

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

نعم ، أنت بحاجة إلى مساحات أسماء ويجب استخدامها

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

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

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