ネストされた配列とマジックメソッド

おそらく誰もが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