2

通常はJavaを使用します。私は今日、このようなスニペットを見てきました

$oStrategie = new Strategie();

foreach($aData as $key=>$value) {
        $oStrategie[$key] = $value;
}

$oStrategie->doSomething()

Strategie は、何も特別なものを持たない自作の php クラスです。重要なことを何もしない単純なコンストラクターなど。

クラス Strategie では、メソッド doSomething() が $aData の ArrayValues にアクセスします

$this['array_index_1'] 

ストラテジークラスに属性が定義されておらず、セッターが上書きされていない場合でも、配列にアクセスできるのはなぜですか? そこで何が起こっているのか誰か説明してもらえますか? PHPのクラスに属性を持つ必要はありませんか???

4

1 に答える 1

3

クラスはArrayAccessインターフェースを実装します。これは、次のメソッドを実装することを意味します。

ArrayAccess {
    abstract public boolean offsetExists ( mixed $offset )
    abstract public mixed offsetGet ( mixed $offset )
    abstract public void offsetSet ( mixed $offset , mixed $value )
    abstract public void offsetUnset ( mixed $offset )
}

$var[$offset]これにより、このクラスのインスタンスで配列アクセスを使用できます。$container以下は、配列を使用してプロパティを保持する、このようなクラスの標準実装です。

class Strategie implements ArrayAccess {

    private $container = array();

    public function __construct() {
        $this->container = array(
            "something"   => 1,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

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

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

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

の実際の実装Strategieや派生元​​のクラスを見ないと、実際に何をしているのかを知るのは困難です。

ただし、これを使用すると、たとえば存在しないオフセットにアクセスする場合など、クラスの動作を制御できます。次のように置き換えるoffsetGet($offset)とします。

public function offsetGet($offset) {
    if (isset($this->container[$offset])) {
        return $this->container[$offset];
    } else {
        Logger.log('Tried to access: ' + $offset);
        return $this->default;
    }
}

これで、存在しないオフセットにアクセスしようとすると、デフォルト (例: $this->default) が返され、たとえばエラーがログに記録されます。

__set()マジック メソッド、__get()__isset()およびを使用して、同様の動作を実現できることに注意してください__unset()。先ほどリストした魔法のメソッドとの違いはArrayAccess、プロパティにアクセスするの$obj->propertyではなく、$obj[offset]

于 2012-11-15T23:10:10.457 に答える