ホームページ >バックエンド開発 >PHPチュートリアル >PHP でオブジェクトを配列として使用する
PHP でオブジェクトを配列として使用する
??????? JAVASCRIPT では、配列モードを使用してオブジェクトのプロパティとメソッドにアクセスできることを理解しています。しかし通常、これは不可能です。
??????なぜこんなことをするのですか?このようにすることで、オブジェクトをより便利に操作できるようになり、クラスを定義できるからです。 Key Value 配列を定義する代わりに。もちろん、他の方法がある場合、最も簡単な方法は強制的に配列に変換することです。ただし、これにより、オブジェクト内の元のメソッドが失われます。
????????? ただし、SPL の ArrayObject は、配列モードを使用してプロパティにアクセスするのに役立ちます。しかし、この方法はまだ実装できません。
?????? ArrayObject クラスの構造は次のとおりです (一部のメソッドは php5,1 または php5.2 で追加されました)。
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 ) }?
??????? その中には、なぜ $obj['name'] を使用して $obj->name に直接アクセスできるのでしょうか? 上記の方法のうち主に 3 つ:
??????? offsetGet は $obj['name'] 読み取りメソッドをサポートしています
??????? offsetSet は $obj['name'] 書き込みメソッドをサポートします
??????? ただし、foreach は ArrayAccess の関数 Current などのデフォルトの実装です。
??????? コード例を見てください:
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); //隐私完全暴光?
????????? このコードは次のように出力します:
mockArray0b9f73f8e206867bd1f5dc5957dbcb38NULL
テスト オブジェクト
(
??? [名前] => hello
??? [ニックネーム] => モック配列
)
配列
(
??? [名前] =>hello
??? [ニックネーム] =>mockArray
)
配列
(
??? [名前] => こんにちは
??? [ニック] => モック配列
)
配列
(
??? [名前] =>
??? [test1 年齢] => 21
)
???????????? 強制変換後は配列オブジェクトとなり、メンバー関数はありません。
??????? もちろん、これら 2 つのメソッド offsetGet?offsetSet も必要に応じて書き換えることができます。なぜ?非常に異常なニーズがあれば、間違いなく役立つからです。たとえば、参照を使用して 3 つの配列をオブジェクトにラップし、配列としてアクセスしたいとします。このとき、この2つの関数を書き換える必要があります。もちろん、ArrayAccess インターフェイスの対応する関数も書き直す必要があります。
????????? また、アクセスできる属性はすべてパブリック プロパティです。プライベートの場合はアクセスできません。無理やり配列にしても同じです。ただし、ArrayObject を継承しない場合は異なります。このようなクラスが強制的に配列に変換されると、そのプライバシー (プライベート属性) が暴露されてしまいます。
????????? ただし、プライベート属性が配列に変換された後、元の属性名が保持されていないことがわかります。代わりに、特定の印刷不可能な文字 + クラス名 + 印刷不可能な文字 + 属性名という形式が使用されます。この印刷不可能な文字の ASCII 値はチェックされていません。興味がある場合は、チェックしてください。
?
?
?