这是我为 ArrayAccess 实现https://www.php.net/manual/en/class.iterator.php的尝试。许多示例使用容器数组作为私有成员变量;但如果可能的话,我不想使用容器数组。我不想要容器数组的主要原因是因为我想$DomainData->domainId
在拥有智能感知等的同时访问这样的属性(数组键)。
class DomainData implements ArrayAccess, Iterator
{
private $position = 0;
public $domainId;
public $color;
public function __construct($data = array())
{
$this->position = 0;
foreach ($data as $key => $value) {
$this[$key] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->$offset);
}
public function offsetSet($offset, $value)
{
$this->$offset = $value;
}
public function offsetGet($offset)
{
return $this->$offset;
}
public function offsetUnset($offset)
{
$this->$offset = null;
}
/*****************************************************************/
/* Iterator Implementation */
/*****************************************************************/
public function rewind()
{
$this->position = 0;
}
public function current()
{
return $this[$this->position];
}
public function key()
{
return $this->position;
}
public function next()
{
++$this->position;
}
public function valid()
{
return isset($this[$this->position]);
}
}
调用它:
$domainData = new DomainData([
"domainId" => 1,
"color" => "red"
]);
var_dump($domainData);
foreach($domainData as $k => $v){
var_dump("domainData[$k] = $v");
}
实际的:
object(DomainData)#1 (3) {
["position":"DomainData":private]=>
int(0)
["domainId"]=>
int(1)
["color"]=>
string(3) "red"
}
想要的:
object(DomainData)#1 (3) {
["position":"DomainData":private]=>
int(0)
["domainId"]=>
int(1)
["color"]=>
string(3) "red"
}
string(24) "domainData[domainId] = 1"
string(23) "domainData[color] = red"