سؤال

في PHP ، يمكنك استخدام أقواس مربعة على عنصر للوصول إلى السمات:

$node = /* SimpleXMLElement */
$id = $node['id'];

ما هو غريب $id ليست سلسلة ، إنها أخرى SimpleXMLElement. لماذا ليست سلسلة؟ أجد نفسي أستخدم strval() في كل مكان على هذا.

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

هل كانت مفيدة؟

المحلول

يمكنك توفير صفيف مثل الوصول إلى كائنك من خلال تنفيذ واجهة ArrayAccess, ، وهي جزء من مكتبة PHP القياسية. هذه الواجهة هي واحدة من هؤلاء "حتى لو لم يكن لديك امتداد مكتبة PHP الكامل المثبت ، لا يزال لديك هذه الواجهة متوفرة في PHP 5".

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

public boolean offsetExists  ( string $offset  )
public mixed offsetGet ( string $offset )
public void offsetSet ( string $offset , string $value )
public void offsetUnset ( string $offset )

يجب أن تكون قادرًا على استخدام أقواس مربعة مع الأشياء التي تم تأسيسها.

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

نصائح أخرى

أعتقد أنه يمكنك تمديد فئة SimpleXML ، وتنفيذ ArrayAccess في ذلك.

أما بالنسبة إلى SimpleXML نفسها ، فهي فئة داخلية. الواجهة الوحيدة التي تنفذها لمنطقة مستخدمي PHP هي Traversable.

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

إذا كان النوع صحيحًا (طويلًا) ، فإنه يحاول العثور على العنصر المرقّم ، ويقدم قيمته. إذا كان لديك عنصر عقدة ملموسة مثل $root لعنصر الجذر ، $root[0] سوف تمثل قيمة هذا العنصر:

$root = new SimpleXMLElement('<root a="vala"></root>');
$root[0] = 'hello'; 
# <root a="vala">hello</root>
#                ^^^^^- changed value                     

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

$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[0] = 'hello'; 
# <root a="vala"><child>hello</child></root>
#                       ^^^^^- changed value

يضع قيمة العقدة من الأول child عنصر. سيضيف أحد الفهرس إلى طفل جديد:

$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[1] = 'hello'; 
# <root a="vala"><child/><child>hello</child></root>
#                        ^--  added child --^

هذا يعمل إلى حد كبير مثل مع المصفوفات. الأوتار التي هي رقم عدد صحيح ، تعمل مثل عدد صحيح:

$root->child['1'] = 'hello'; 
# <root a="vala"><child/><child>hello</child></root>
#                        ^--  added child --^

وترك الأقواس فارغة ، ستضيف عنصرًا جديدًا في النهاية:

$root->child[] = 'hello';
$root->child[] = 'world';
# <root a="vala"><child/><child>hello</child><child>world</child></root>

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

مع أي سلسلة ، سيبحث SimpleXML عن عقدة سمة بدلاً من عقدة عنصر الطفل:

$root = new SimpleXMLElement('<root a="vala"></root>');
echo $root['a'], "\n"; # vala

هذا يعمل أيضًا لإضافة السمات:

$root = new SimpleXMLElement('<root a="vala"></root>');
$root['b'] = 'hello'; # <root a="vala" b="hello"/>

تستخدم حالة الحافة سلسلة فارغة ("") أو NULL لأن SimpleXML ثم الأخطاء في القول إن السمة بدون اسم غير صالحة. من المنطقي لأن السمات يجب أن يكون لها اسم:

تحذير: Main (): لا يمكن كتابة أو إنشاء سمة لم يتم تحديد اسمها في ...

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


كي تختصر: ال SimpleXMLElement الفصل لا ينفذ ArrayAccess الواجهة ولكن نظرًا لأنها فئة داخلية ، يمكن أن تضيف سلوكًا مشابهًا. و simplexml يفعل ذلك بالضبط.

تسمى وظيفة الأداة المساعدة في مصادر PHP sxe_prop_dim_read.


ولكن ماذا عن عندما تريد أن تفعل شيئًا مشابهًا مع فصولك؟

هذا ما ArrayAccess الواجهة ل. تنفيذها في الفصول الدراسية الخاصة بك. يأخذ PHP بالفعل بعض العمل من أجلك داخليًا لجعل التعويضات أكثر تشبهًا للمصفوفة: عدد صحيح صحيح ؛ يتم تحويل سلسلة مثل عدد صحيح إلى عدد صحيح ويتم تحويل المنجدات إلى عدد صحيح.

لكن ArrayAccess يسمح بأكثر من مجموعة قياسية: الإزاحة الصالحة هي عوامات ، فارغة ، صفائف وكائنات.

خصوصا مع NULL, ، أنت غير قادر على الاختلاف بين تحديد الإزاحة NULL أو تحديد عنصر جديد - ستقدم كلتا الحالتين NULL كما الإزاحة.

يتوفر تنفيذ مثال للواجهة بسؤال آخر: PHP ، SPL ، واجهة ArrayAccess.

أعتقد أنها الطريقة السحرية __احصل على()

تحرير: أعتقد أنني خمن خطأ. لم أكن أعرف واجهة الوصول إلى الصفيف حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top