0

多次元配列として表されたデータがいくつかあります。これらのデータをOOアプリケーションに埋め込み、これらのデータに追加機能を提供するだけでなく、従来のランダムアクセスとイテレーターの両方を使用してデータにアクセスする方法も提供したいと思います(foreachを使用できるように)。つまり、多次元配列のラッピングクラスを実装したいと思います。

私がすでに試したこと:

I. ArrayAccess これの問題は、サーバーがPHP 5.2.17を使用し&offsetGet()てエラーを出すため、参照で戻ることができないことです。つまり、多次元要素アクセスを実装できません。

$obj[$key1][$key2] = $value;

現在、新しいPHPバージョンへのアップグレードはオプションではないことに注意してください

II。魔法の方法を使用する これは少し注意が必要ですが、変数をキーとして使用しようとすると問題が発生しました。例えば

$obj->$key1[$key2] = $value;

インタプリタは最初$key1[$key2]に通知をスローして$key1の最初の文字を返すことを評価し、それを配列のキーとして使用します。私もこれを解決する方法がわかりません。ブラケットを使用して操作の優先順位を強制することを考えましたが、それは次の試みと同じ問題がありました。

III。単純なgetおよびset関数の使用 繰り返しますが、古いPHPです。私が書き込もうとすると泣きます:

$obj->get($key1)[$key2] = $value;

丸括弧で終わる式にインデックスを付ける方法がわからないためです。

失われたリゾートオプションはまだあります。アレイを公開し、OOをすべて一緒に忘れてください。しかし、そこに行く前に、これを行う他の方法が本当にないことを確認したいと思います。

4

2 に答える 2

2

時々、それは例で最もよく示されます。たとえば、製品の注文数量を含む多次元配列を作成できます。最初のインデックスは顧客を定義し、2番目は注文を定義し、3番目は製品を定義します。その場合、値は数量です。

IV。単純なgetおよびset関数を使用しますが、複数のパラメーターを使用します。

$value = $obj->get($key1, $key2);
$obj->set($key1, $key2, $value);

また

$quantity = $orderedQuantities($customerName, $orderNo, $productCode);

オブジェクトラッパーを作成する本質は、オブジェクトのように見え、そのように動作することです。配列のように見え、動作するように実装する場合は、配列を使用することもできます。&配列のように動作するオブジェクトで配列をラップする唯一の理由は、パラメーターを使用せずに、参照によって配列を渡すことができるためです。

それが目標である場合は、配列を$ objに割り当て、を使用します$obj->arrayprop[$key1][$key2]。一方、オブジェクトのように動作させたい場合は、配列構文を完全にスキップしてください。

V.ネストされたオブジェクト の使用同じ例を使用して、注文オブジェクトなどを埋め込むcustomersオブジェクト(コレクションの一種)を作成できます。

$ Quantity = $ Customers-> getCustomerByName($ customerName)-> getOrder($ orderNo)-> getProduct($ productCode)-> Quantity;

または、読みやすくするために:

$ customer = $ customers-> getCustomerByName($ customerName); $ order = $ customer-> getOrder($ orderNo); $ orderLine = $ order-> getOrderLine($ productCode); $ Quantity = $ product-> Quantity;

現在、これらの各エンティティはオブジェクトによって表されています。利点は、この構造を追加のプロパティで簡単に拡張できることです。顧客コレクション'findByCustomerNo'および'findByName'メソッドを指定して特定の顧客を検索できますが、'filterByPostalCode'を指定すると、その郵便番号の顧客のみを含む新しいコレクションを返すことができます。

$ orderに、合計を計算する関数を含めることができるようになりました。

$ orderLineには、productCode(キー)と数量のみを含めることができますが、それをオブジェクトにすることで、割引、カスタマイズされた名前や説明、またはその他のプロパティを簡単に追加できます。

全体として、この構造は多くの柔軟性を可能にしますが、最初はもう少しタイピングし、少し慣れる必要があります。

于 2012-12-03T02:28:39.780 に答える
0

ネストされたオブジェクトを使用すると、参照を渡さなくてもArrayAccessを機能させることができます。しかし、組み込みの配列関数を完全に忘れることができます。

<?php
class ArrObj implements ArrayAccess {
    private $arr;

    public function __construct($arr = null) {
        $this->arr = $arr;
    }

    public function offsetExists($key) {
        return isset($this->arr[$key]);
    }

    public function offsetGet($key) {
        return $this->arr[$key];
    }

    public function offsetSet($key, $val) {
        return $this->arr[$key] = $val;
    }

    public function offsetUnset($key) {
        unset($this->arr[$key]);
    }
}

$a = new ArrObj(array(
    'foo' => new ArrObj(array(
        'bar' => 'qwe'
    ))
));

echo $a['foo']['bar'] . '<br />';
$a['foo']['bar'] = 'asd';
echo $a['foo']['bar'] . '<br />';
?>

出力:

qwe
asd
于 2012-12-03T04:03:30.783 に答える