4

有一个魔术方法__toString,如果对象在字符串上下文中使用或强制转换为此类,则会触发该方法,例如

<?php 

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

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

当一个对象被转换成一个对象时,是否会触发类似的功能(array)

4

2 回答 2

2

不,但是有ArrayAccess接口,它允许您将类用作数组。要获得循环功能,foreach您需要接口IteratorAggregateIterator. 如果您有一个正在使用的内部数组,则前者更易于使用,因为您只需要覆盖一个方法(它提供 的实例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 回答
2

这可能不是您所期望的,因为您所期望的不能作为 PHP 的语言功能提供(不幸的是),但这里有一个众所周知的解决方法:

用于get_object_vars()此:

$f = new Foo();
var_dump(get_object_vars($f));

它将返回一个关联数组,其中属性名称作为索引及其值。检查这个例子:

class Foo {

    public $bar = 'hello world';

    // even protected and private members will get exported:
    protected $test = 'I\'m protected';
    private $test2 = 'I\'m private';


    public function toArray() {
        return get_object_vars($this);
    }   

}

$f = new Foo();
var_dump($f->toArray());

输出:

array(2) {
  'bar' =>
  string(11) "hello world"
  'test' =>
  string(13) "I'm protected"
  'test2' =>
  string(13) "I'm private"
}
于 2013-05-04T18:53:09.613 回答