Nasıl Basit XML [] operatörünü kullanır?

4 Cevap php

PHP size özelliklerini erişmek için bir öğe üzerinde köşeli parantez kullanabilirsiniz:

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

Ne garip $id bir dize Başka SimpleXMLElement var, olmasıdır. Neden bir dize değil mi? Ben kendimi bu konuda biryere strval() kullanarak bulabilirsiniz.

Nasıl köşeli parantez çalışıyorsunuz? Ben kendi sınıfları ile bunu yapabilir mi? Ben bu konuda dokümanlar şey görmedim.

4 Cevap

Sen PHP Standart Kitaplığın parçası olan ArrayAccess interface, uygulayarak nesneye erişim gibi Array sağlayabilir. Bu arayüz bu "Eğer tam PHP Standart Kütüphanesi uzantısı yüklü olmasa bile, yine de PHP 5 bu arayüz kullanılabilir olması" şeylerden biridir.

Bu arabirim uygulayan, ve sınıf için dört yöntem tanımlayarak

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

Eğer örneği nesnelerle köşeli parantez kullanmak gerekir.

Aslında ArrayAccess arabirimini uygulayan varsa SimpleXML kendisi için olduğu gibi, ben emin değilim, ya da bunu bu süper güçler verir PHP kaynak perde arkasında gidiyor başka bir şey varsa.

Ben SimpleXML sınıfını genişletmek ve şöyle ArrayAccess uygulayabilirsiniz inanıyorum.

SimpleXML kendisi için olduğu gibi, bir iç sınıftır. PHP userspace için uygulayan sadece arayüz Traversable .

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 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 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 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.

Ben sihirli yöntem sanırım __get()

Edit: Ben yanlış tahmin düşünüyorum. Henüz Dizi Erişim arayüzü bilmiyordum.