有一个魔术方法__toString
,如果对象在字符串上下文中使用或强制转换为此类,则会触发该方法,例如
<?php
class Foo {
public function __toString() {
return 'bar';
}
}
echo (string) new Foo(); // return 'bar';
当一个对象被转换成一个对象时,是否会触发类似的功能(array)
?
有一个魔术方法__toString
,如果对象在字符串上下文中使用或强制转换为此类,则会触发该方法,例如
<?php
class Foo {
public function __toString() {
return 'bar';
}
}
echo (string) new Foo(); // return 'bar';
当一个对象被转换成一个对象时,是否会触发类似的功能(array)
?
不,但是有ArrayAccess
接口,它允许您将类用作数组。要获得循环功能,foreach
您需要接口IteratorAggregate
或Iterator
. 如果您有一个正在使用的内部数组,则前者更易于使用,因为您只需要覆盖一个方法(它提供 的实例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'
这可能不是您所期望的,因为您所期望的不能作为 PHP 的语言功能提供(不幸的是),但这里有一个众所周知的解决方法:
$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"
}