4

__toStringオブジェクトが文字列コンテキストで使用された場合、またはそのようなものにキャストされた場合にトリガーされる魔法のメソッドがあります。

<?php 

class Foo {
    public function __toString() { 
        return 'bar'; 
  } 
} 

echo (string) new Foo(); // return 'bar';

オブジェクトがキャストされたときにトリガーされる同様の関数はあり(array)ますか?

4

2 に答える 2

2

いいえ。ただしArrayAccess、クラスを配列として使用できるインターフェイスがあります。ループ機能を取得するforeachには、インターフェイスIteratorAggregateまたはIterator. 1 つのメソッド ( のインスタンスを提供する) をオーバーライドするだけでよいため、使用している内部配列がある場合は前者の方が使いやすいですArrayIteratorが、後者では反復処理をより細かく制御できます。

例:

class Messages extends ArrayAccess, IteratorAggregate {
    private $messages = array();

    public function offsetExists($offset) {
        return array_key_exists($offset, $this->messages);
    }

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

    public function offsetSet($offset, $value) {
        $this->messages[$offset] = $value;
    }

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

    public function getIterator() {
        return new ArrayIterator($this->messages);
    }
}

$messages = new Messages();
$messages[0] = 'abc';
echo $messages[0]; // 'abc'

foreach($messages as $message) { echo $message; } // 'abc'
于 2013-05-04T18:47:46.930 に答える