SimpleXML kendisi için olduğu gibi, bir iç sınıftır. PHP userspace için uygulayan sadece arayüz Traversable
a>.
Köşeli parantez ile erişilen dahili zaman, SimpleXML indeks / anahtarının değerine ve tipine bağlı şeyler arar.
Tamsayı (uzun) ise, sıfır-endeksli sayılı eleman bulmak ve değerini sunmak için çalışır. Eğer kök öğesi için $root
gibi somut bir düğüm elemanı varsa, $root[0]
o öğenin değerini temsil edecek:
$root = new SimpleXMLElement('<root a="vala"></root>');
$root[0] = 'hello';
# <root a="vala">hello</root>
# ^^^^^- changed value
Sadece bir tane var çünkü kök öğesi biraz ilginç. Bu anne var elemanları ile daha ilginç.
$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[0] = 'hello';
# <root a="vala"><child>hello</child></root>
# ^^^^^- changed value
Ilk child
elemanın düğüm değerini ayarlar. Up-one bir dizin yeni bir çocuk ekler:
$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[1] = 'hello';
# <root a="vala"><child/><child>hello</child></root>
# ^-- added child --^
Dizilerle gibi bu oldukça fazla çalışır. Bir tamsayı sayıda dizeleri, tamsayı gibi çalışır:
$root->child['1'] = 'hello';
# <root a="vala"><child/><child>hello</child></root>
# ^-- added child --^
Ve boş parantez bırakarak, sonunda yeni bir öğe eklemek olacaktır:
$root->child[] = 'hello';
$root->child[] = 'world';
# <root a="vala"><child/><child>hello</child><child>world</child></root>
Şimdiye kadar tamsayılar ve "hayır" ofset. Standart bir PHP dizi gibi, bu geçiş ile karıştırmamak gerekir NULL
. Bu boş bir dizeye dönüştürülür olacaktır ""
.
Herhangi bir dize ile, SimpleXML bir çocuk yerine eleman düğümünün bir öznitelik düğümü arar:
$root = new SimpleXMLElement('<root a="vala"></root>');
echo $root['a'], "\n"; # vala
Bu da özelliklerini eklemek için çalışır:
$root = new SimpleXMLElement('<root a="vala"></root>');
$root['b'] = 'hello'; # <root a="vala" b="hello"/>
Bir kenar-case (""
) kullanarak boş bir dize veya NULL
çünkü SimpleXML sonra hatalar dışarı hiçbir adla bir nitelik geçersiz olduğunu söyleyerek. Nitelikler bir adı olmalıdır gibi mantıklı:
Uyarı: main (): yazmak ya da isimsiz özellik yaratmak değil miyim ...
Başka daha özel durum __toString
sihirli yöntemi a> destek. Eğer ofset olarak bir nesneye başarılı olursa, SimpleXML sihirli yöntemi ile dizeye dönüştürmek için çalışacağız. Daha sonra, yukarıda tarif edildiği gibi geri dize kullanır.
To summarize: SimpleXMLElement
class ArrayAccess
a> arabirimi uygulamak değil ama bir iç sınıf olarak, bir dizi-benzer davranışlar ekleyebilirsiniz. Ve SimpleXML tam olarak bunu yapıyor.
PHP kaynaklardan yarar fonksiyon sxe_prop_dim_read
a> denir.
Ama ne sınıfları ile benzer bir şey yapmak istiyorum ne dersiniz?
İşte ArrayAccess
arayüzü için budur. Kendi sınıflarında uygulamak. PHP zaten uzaklıklar daha fazla dizi gibi yapmak için dahili sizin için bazı iş alır: tamsayı stay tamsayı; tamsayı gibi dize tamsayı dönüştürülür ve mantıksal tamsayı dönüştürülür.
Ancak ArrayAccess
bir dizi standart daha veriyor: geçerli uzaklıklar mantarlar, null, diziler ve nesneler vardır.
Özellikle ile NULL
, sen ofset NULL
ayar veya yeni bir öğe ayarı arasında farklılık mümkün değildir - ofset olarak hem de vaka NULL
sağlayacaktır.
Arayüzü bir örnek uygulama başka bir soru ile kullanılabilir: PHP, SPL, ArrayAccess Interface.