它可以做你想做的。
這個例子的靈感來自Zend_Config,並且在ArrayAccess interface的PHP文檔中給出了這個例子。
編輯:
只有一個小的警告:你需要調用
toArray()
上表示數組,將其轉換爲一個數組數據,作爲類的內部需要陣列數據隱蔽到自己的一個實例,以允許訪問對象屬性運算符
->
:
呃,那當然不是必須的了,因爲它現在實現了ArrayAccess。;-)
/編輯
class Config
implements ArrayAccess
{
protected $_data;
public function __construct(array $data)
{
foreach($data as $key => $value)
{
$this->$key = $value;
}
}
public function __get($key)
{
return $this->offsetGet($key);
}
public function __isset($key)
{
return $this->offsetExists($key);
}
public function __set($key, $value)
{
$this->offsetSet($key, $value);
}
public function __unset($key)
{
$this->offsetUnset($key);
}
public function offsetSet($offset, $value)
{
$value = is_array($value) ? new self($value) : $value;
if(is_null($offset))
{
$this->_data[] = $value;
}
else
{
$this->_data[ $offset ] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->_data[ $offset ]);
}
public function offsetUnset($offset)
{
unset($this->_data[ $offset ]);
}
public function offsetGet($offset)
{
return isset($this->_data[ $offset ]) ? $this->_data[ $offset ] : null;
}
public function toArray()
{
$array = array();
$data = $this->_data;
foreach($data as $key => $value)
{
if($value instanceof Config)
{
$array[ $key ] = $value->toArray();
}
else
{
$array[ $key ] = $value;
}
}
return $array;
}
}
編輯2:
的Config
類甚至可以大大延長ArrayObject
簡化。作爲一個額外的好處,你也可以將它轉換爲適當的數組。
class Config
extends ArrayObject
{
protected $_data;
public function __construct(array $data)
{
parent::__construct(array(), self::ARRAY_AS_PROPS);
foreach($data as $key => $value)
{
$this->$key = $value;
}
}
public function offsetSet($offset, $value)
{
$value = is_array($value) ? new self($value) : $value;
return parent::offsetSet($offset, $value);
}
}
實例:
$configData = array(
'some' => array(
'deeply' => array(
'nested' => array(
'array' => array(
'some',
'data',
'here'
)
)
)
)
);
$config = new Config($configData);
// casting to real array
var_dump((array) $config->some->deeply->nested->array);
$config->some->deeply->nested->array = array('new', 'awsome', 'data', 'here');
// Config object, but still accessible as array
var_dump($config->some->deeply->nested->array[ 0 ]);
$config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ] = array('yet', 'more', 'new', 'awsome', 'data', 'here');
var_dump($config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ]);
$config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ][] = 'append data';
var_dump($config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ]);
var_dump(isset($config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ]));
unset($config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ]);
var_dump(isset($config[ 'some' ][ 'deeply' ][ 'nested' ][ 'array' ]));
// etc...
也許這樣的數據不能用詞語「配置」來表示;將其存儲在數據庫中 – Dor
當我的答案更符合您的問題要求時,爲什麼選擇ErikPerik的答案作爲最佳答案?並不是說我不想授予ErikPerik的代表點。我只是好奇你爲什麼覺得他的答案是更好的答案? –
我原本以爲他的解決方案很乾淨,直到我看到你的更新版本。利用'ArrayObject'是我以前從未做過的事情,絕對需要查看它! – Industrial