English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل PHP الأساسي

دليل PHP المتقدم

PHP & MySQL

دليل PHP

النطاقات PHP

تم إضافة النطاقات في PHP (namespace) في PHP 5.3، إذا كنت قد درست C# وJava، فإن النطاقات ليست شيئًا جديدًا. ولكن في PHP، لديها أهمية كبيرة.

يمكن للنطاقات في PHP حل كلا من النوعين التاليين من المشاكل:

  • تعارض الأسماء بين الكود المكتوب من قبل المستخدم مع الفئات أو الوظائف أو المتغيرات الثابتة الموجودة في PHP الداخلية أو الفئات أو الوظائف أو المتغيرات الثابتة الثالثة.

  • تُنشأ أسماء اختصارية (أو قصيرة) للإشارات المسمى الطويلة (عادةً لمعالجة المشكلة الأولى من نوعها) لتحسين قابلية قراءة الكود المصدر.

تحديد النطاق

بالافتراض، يتم وضع جميع المتغيرات الثابتة والفئات والوظائف في النطاق العام، كما كان الحال في PHP قبل دعم النطاقات.

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

يمكنك أيضًا تحديد كود نطاقات مختلفة في نفس الملف، مثلًا:

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

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

الجملة الوحيدة المقبولة قبل إعلان النطاق هي إعلان الت编码 لمصدر الملف. لا يجب أن تظهر أي كود غير PHP بما في ذلك الفواصل العازلة قبل إعلان النطاق.

سيظهر الكود التالي خطأ لغوي:

<html>

النطاق الفرعي

مثل علاقة الدليل والملف، يسمح النطاق الحالي لـ PHP بتحديد اسم النطاق المتعدد المستويات. لذلك، يمكن تعريف اسم النطاق كطريقة متعددة المستويات:

النموذج أعلاه أنشأ الكونstant MyProject\Sub\Level\CONNECT_OK، الفئة MyProject\Sub\Level\Connection والوظيفة MyProject\Sub\Level\Connect.

استخدام النطاق

يمكن تسمية اسماء الفئات في النطاق الحالي لـ PHP بثلاث طرق:

  • الاسم غير المحدد، أو اسم الفئة بدون بدل.على سبيل المثال $a=new foo(); أو foo::staticmethod();. إذا كان النطاق الحالي هو currentnamespace، سيتم تفسير foo كـ currentnamespace\foo. إذا كان الكود الذي يستخدم foo عالميًا، لا يحتوي على أي نطاق، فإن foo سيتم تفسيره كـ foo. تحذير: إذا لم يتم تعريف الدالة أو الكونstant في النطاق، فإن اسم الدالة أو الكونstant غير المحدد سيتم تفسيره كـ اسم الدالة أو الكونstant العالمية.

  • 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。

  • 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

下面是一个使用这三种方式的示例:

file1.php 文件代码

file2.php 文件代码

يرجى الانتباه أن الوصول إلى أي فئة كلية أو دالة أو معلمة يمكن القيام به باستخدام الاسم الكامل، مثل \strlen() أو \Exception أو \INI_ALL.

الوصول إلى الفئات والadol والمعلمات الكلية داخل النطاق:

النطاقات والميزات الديناميكية للغة

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

كود ملف example1.php:

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

الوصول الديناميكي إلى عناصر النطاق

الكلمة المفتاحية namespace والكونية __NAMESPACE__

يدعم PHP طريقتين للاستدلال على العناصر الداخلية للمساحة الاسمية الحالية، الكونية __NAMESPACE__ والكلمة المفتاحية namespace.

قيمة الكونية __NAMESPACE__ هي قائمة من النصوص تحتوي على اسم المساحة الاسمية الحالية. في الكود العالمي، والذي لا يحتوي على أي مساحة اسمية، تحتوي على نص فارغ.

__NAMESPACE__ مثال، كود داخل المساحة الاسمية

__NAMESPACE__ مثال، كود عالمي

ال상ية __NAMESPACE__ مفيدة جدًا في إنشاء الأسماء الديناميكية، مثل:

استخدام __NAMESPACE__ لإنشاء اسم ديناميكي

يمكن استخدام الكلمة المفتاحية namespace لاستدعاء عناصر المساحة الحالية أو المساحة الفرعية. إنه يعادل عملاق self في الفئة.

عملاق namespace، كود في المساحة

namespace عملاق، كود عالمي

استخدام مسمى الفضاء: بديل/استيراد

يدعم PHP مسميات الفضاء استخدام بديلين للاستيراد: استخدام اسم بديل للفئات أو استخدام اسم بديل للفضاء.

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

1. استخدام حرف use لاستيراد/استخدام اسم بديل

2. سطر يحتوي على عدة تعليمات use

عملية الاستيراد تتم أثناء التجميع، ولكن أسماء الفئات أو الدوال أو القيم الثابتة الديناميكية ليست كذلك.

3. استيراد وتسمية ديناميكية

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

4. استيراد وتسمية مطلقة

استخدام الفضاءات الاسمية: الوظائف/الكميات العالمية الموجودة في الفضاءات الاسمية

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

1- الوصول إلى الفئات العالمية في الفضاءات الاسمية

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

2- الوظائف/الكميات العالمية الموجودة في الفضاءات الاسمية

الفضاء العالمي

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

استخدام التعريف بالفضاءات العالمية

命名空间的顺序

自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。

يتبع تفسير الأسماء المحددة القواعد التالية:

  1. الاستدعاءات على الأسماء المحددة الكاملة للوظائف والكائنات والقيم يتم تفسيرها عند التجميع. على سبيل المثال      new \A\B يتم تحويله إلى كائن A\B

  2. كل الأسماء غير المحددة والأسماء المحددة (غير الأسماء المحددة الكاملة) يتم تحويلها بناءً على قواعد الاستيراد الحالية عند التجميع. على سبيل المثال، إذا كان الحيز     A\B\C تم استيراده كـ C،ثم الاستدعاء C\D\e()     الاستدعاء سيتم تحويله إلى A\B\C\D\e()

  3. داخل الحيز، يتم إضافة اسم الحيز الحالي أمام جميع الأسماء المحددة التي لم يتم تحويلها بناءً على قواعد الاستيراد. على سبيل المثال، إذا كان الحيز     A\B الاستدعاء الداخلي C\D\e()،ثم C\D\e()     سيتم تحويله إلى A\B\C\D\e()

  4. أسماء الكائنات غير المحددة تتم تحويلها بناءً على قواعد الاستيراد الحالية عند التجميع (باستخدام الاسم الكامل بدلاً من الاسم القصير). على سبيل المثال، إذا كان الحيز     A\B\C إذا تم استيرادC، فإن new C()     يتم تحويله إلى new A\B\C()

  5. داخل الحيز (مثلA\B)، يتم تفسير الاستدعاءات غير المحددة للوظائف في وقت التشغيل. على سبيل المثال، الاستدعاء      foo() الاستدعاء يتم تفسيره كالتالي:

    1. البحث عن اسم A\B\foo() الوظيفة

    2. حاول البحث والاستدعاء العالمي(global) الوظائف في الحيز foo()

  6. في الحيز (مثلA\Bداخل)الاستدعاءات غير المحددة أو المحددة الكائنات (غير الأسماء المحددة الكاملة) يتم تفسيرها في وقت التشغيل. إليك الاستدعاء      new C() و new D\E() عملية التفسير:       new C()التفسير: new D\E()التفسير: من أجل الاستعانة بكائنات الكائنات العالمية في الحيز العالمي، يجب استخدام الاسم المحدد الكامل new \C()

    1. إضافة اسم الحيز الحالي أمام اسم الكائن يصبح:A\B\D\E،ثم البحث عن هذا الكائن.

    2. حاول تحميل الكائن تلقائيًا A\B\D\E

    3. البحث في الحيز الحاليA\B\Cالكائن.

    4. حاول تحميل الكائن تلقائيًاA\B\C