ネストされた配列とマジックメソッド
おそらく誰もがPHPのマジック(マジック)メソッド、特に__getメソッドと__setメソッドについて知っています。 ただし、ネストされた配列の値を変更する必要がある場合、不快な機能があります。 この問題を解決するには、シンプルでエレガントなソリューションがあります。
このクラスを検討してください:
クラス MyClass {
protected $ data = array ( 'some' => array ( 'sub' => 'data' ) ) ;
パブリック 関数 __set ( $ name 、 $ value ) {
$ this- > data [ $ name ] = $ value ;
}
パブリック 関数 __get ( $ name ) {
$ this- > data [ $ name ]を 返し ます。
}
}
次のように、$データ配列のいくつかのキーのサブ値を変更しようとした場合:
$ my = new MyClass ( ) ;
$ my- > some [ 'sub' ] = 'test' ; //値を変更しようとします
echo $ my- > some [ 'sub' ] ; // 'データ'を出力します
通知が出ます:
Notice:オーバーロードされたプロパティMyClassの間接的な変更:: $ someは効果がありません
この問題を解決するために、別のクラスを作成します(ActiveRecordの一部であるため、ActiveArrayと呼ばれます)。
クラス ActiveArray {
保護された$配列 。
パブリック 関数 __construct ( $ array ) {
$ this- > array = & $ array ;
}
パブリック 関数 __set ( $ name 、 $ value ) {
$ this- > array [ $ name ] = $ value ;
}
パブリック 関数 __get ( $ name ) {
if ( is_array ( $ this- > array [ $ name ] ) ))
新しい 自己を 返す ( & $ this- > array [ $ name ] ) ;
他に
$ this- > array [ $ name ]を 返し ます。
}
}
そして、MyClassクラスの__getメソッドをわずかに変更します。
パブリック 関数 __get ( $ name ) {
if ( is_array ( $ this- > data [ $ name ] ) ))
新しい ActiveArray ( & $ this- > data [ $ name ] )を 返し ます。
他に
$ this- > data [ $ name ]を 返し ます。
}
これで、次の方法でネストされた配列にアクセスできます。
$ my- > some- > sub = 'test' ;
echo $ my- > some- > sub ; // 'test'を出力します
$ my- > some = array ( 'abc' => 123 ) ;
echo $ my- > some- > abc ; // '123'を出力します
ご清聴ありがとうございました!
All Articles