67

具体的には、配列クラスを作成し、[]演算子をオーバーロードしたいと思います。

4

6 に答える 6

54

PHP5を使用している場合(そして使用する必要がある場合)は、SPLArrayObjectクラスを確認してください。ドキュメントはあまり良くありませんが、ArrayObjectを拡張すると、「偽の」配列が作成されると思います。

編集:これが私の簡単な例です。ただし、貴重なユースケースはありません。

class a extends ArrayObject {
    public function offsetSet($i, $v) {
        echo 'appending ' . $v;
        parent::offsetSet($i, $v);
    }
}

$a = new a;
$a[] = 1;
于 2009-04-24T22:06:01.497 に答える
28

実際、最適なソリューションは、ArrayAccessインターフェイスの4つのメソッドを実装することです。http: //php.net/manual/en/class.arrayaccess.php

'foreach'のコンテキストでもオブジェクトを使用する場合は、'Iterator'インターフェイスを実装する必要があります: http ://www.php.net/manual/en/class.iterator.php

于 2011-12-15T09:06:42.430 に答える
23

PHPのオーバーロードと演算子の概念(オーバーロード配列演算子を参照)は、C++の概念とは異なります。+、-、[]などの演算子をオーバーロードすることはできないと思います。

可能な解決策

于 2009-04-24T22:00:57.250 に答える
9

PHP 5.0以降のシンプルでクリーンなソリューションの場合、ArrayAccessインターフェースを実装し、関数offsetGet、offsetSet、offsetExists、offsetUnsetをオーバーライドする必要があります。これで、オブジェクトを配列のように使用できます。

例(PHP7 +の場合):

<?php
class A implements ArrayAccess {
    private $data = [];

    public function offsetGet($offset) {
        return $this->data[$offset] ?? null;
    }

    public function offsetSet($offset, $value) {
        if ($offset === null) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

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

    public function offsetUnset($offset) {
        unset($this->data[$offset]);
    }
}

$obj = new A();
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print "ab"
于 2014-06-03T09:09:19.147 に答える
1

この言語の機能ではないようです。このバグを参照してください。ただし、ある種のオーバーロードを実行できるパッケージがあるようです。

于 2009-04-24T22:02:16.110 に答える
-1

簡単に言えば、いいえ。また、C ++スタイルのオーバーロードが必要だと思われる場合は、問題の解決策を再考する必要があるかもしれません。または、PHPを使用しないことを検討してください。

ジェイミー・ザウィンスキーを言い換えると、「あなたには問題があり、 『わかっている!演算子のオーバーロードを使用する!』と思う。」今、2つの問題があります。」

于 2009-04-25T02:45:54.600 に答える