Heim > Artikel > Backend-Entwicklung > Verwenden von Objekten als Arrays in PHP
Wir verstehen, dass in JAVASCRIPT auf die Eigenschaften und Methoden von Objekten im Array-Modus zugegriffen werden kann. Aber normalerweise ist dies nicht möglich.
Warum machst du das? Dies liegt daran, dass Objekte auf diese Weise bequemer manipuliert werden können und wir eine Klasse definieren können. Anstatt ein Schlüsselwert-Array zu definieren. Wenn wir andere Methoden haben, besteht die einfachste natürlich darin, die Konvertierung in ein Array zu erzwingen. Allerdings gehen dadurch die ursprünglichen Methoden im Objekt verloren.
ArrayObject in SPL kann uns jedoch dabei helfen, im Array-Modus auf Eigenschaften zuzugreifen. Doch die Methode lässt sich immer noch nicht umsetzen.
Die ArrayObject-Klassenstruktur ist wie folgt (einige Methoden wurden in PHP5,1 oder PHP5.2 hinzugefügt):
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable { /* 常量 */ const integer STD_PROP_LIST = 1 ; const integer ARRAY_AS_PROPS = 2 ; /* 方法 */ __construct ([ mixed $input [, int $flags [, string $iterator_class ]]] ) void append ( mixed $value ) void asort ( void ) int count ( void ) array exchangeArray ( mixed $input ) array getArrayCopy ( void ) int getFlags ( void ) ArrayIterator getIterator ( void ) int getIteratorClass ( void ) void ksort ( void ) void natcasesort ( void ) void natsort ( void ) bool offsetExists ( mixed $index ) mixed offsetGet ( mixed $index ) void offsetSet ( mixed $index , mixed $newval ) void offsetUnset ( mixed $index ) public void serialize ( void ) void setFlags ( int $flags ) void setIteratorClass ( string $iterator_class ) void uasort ( callback $cmp_function ) void uksort ( callback $cmp_function ) public void unserialize ( string $serialized ) }
Darunter: Warum können wir $obj['name' verwenden? ] Wie wäre es mit dem direkten Zugriff auf $obj->name? Hauptsächlich die drei oben genannten Methoden:
offsetGet unterstützt die Lesemethode $obj['name']
offsetSet unterstützt die Schreibmethode $obj['name']
Aber foreach ist das Standardimplementierung der Funktion Current von ArrayAccess und so weiter.
Sehen Sie sich einen Beispielcode an:
class test extends ArrayObject{ public $name; private $age = 21; public function show(){ print_r(get_object_vars($this)); } } class test1{ public $name; private $age = 21; public function show(){ print_r(get_object_vars($this)); } } $obj=new test(); //使用数组方式读写属性 $obj['name']='hello'; $obj['nick']='mockArray'; echo $obj['nick'], '</br>'; var_dump($obj['show']);//检测是否可以访问方法: print_r($obj);//输出对象 $obj->show();//调用方法 $arr=(array)$obj; //强制转换成数组。 print_r($arr); //$arr->show(); 此行将出错,因为,原有方法全部丢失。 $obj1=new test1(); //创建普通对象 $arr1=(array)$obj1; //强制转换成数组。 print_r($arr1); //隐私完全暴光
Dieser Code gibt Folgendes aus:
mockArray0b9f73f8e206867bd1f5dc5957dbcb38NULL
test Object
(
[Name] => Hallo
[Nick] => MockArray
)
Array
(
[Name] => Hallo
[Nick] => MockArray
)
Array
(
[name] => hallo
[nick] => mockArray
)
Array
(
[name] = >
[ test1 age] => 21
)
Es ist ersichtlich, dass Sie den Array-Modus verwenden können, um auf Eigenschaften zuzugreifen, aber nicht auf Methoden (Mitgliedsfunktionen).
Nach der erzwungenen Konvertierung ist es ein Array-Objekt und hat keine Mitgliedsfunktionen.
Natürlich können die beiden Methoden offsetGet und offsetSet auch entsprechend unseren Anforderungen weiter umgeschrieben werden. Warum? Denn wenn es einige sehr ungewöhnliche Bedürfnisse gibt, wird es auf jeden Fall nützlich sein. Beispielsweise möchten wir drei Arrays mithilfe von Referenzen in ein Objekt einbinden und als Array darauf zugreifen. Zu diesem Zeitpunkt müssen diese beiden Funktionen neu geschrieben werden. Natürlich müssen auch die entsprechenden Funktionen in der ArrayAccess-Schnittstelle neu geschrieben werden.
Darüber hinaus sind alle zugänglichen Grundstücke öffentliche Grundstücke. Wenn es privat ist, kann nicht darauf zugegriffen werden. Auch wenn es in ein Array gezwungen wird, ist es dasselbe. Aber wenn Sie ArrayObject nicht erben, ist es anders. Sobald die Konvertierung einer solchen Klasse in ein Array erzwungen wird, wird ihre Privatsphäre (private Attribute) offengelegt.
Wir können jedoch sehen, dass nach der Konvertierung des privaten Attributs in ein Array der ursprüngliche Attributname nicht beibehalten wird. Stattdessen wird die Form verwendet: ein bestimmtes nicht druckbares Zeichen + Klassenname + nicht druckbares Zeichen + Attributname. Der ASCII-Wert dieses nicht druckbaren Zeichens wurde nicht überprüft. Wenn Sie interessiert sind, können Sie es sich ansehen!