यह तुम क्या चाहते करने के लिए संभव है:
यह एक ओवरराइड समारोह Demo का एक कोड उदाहरण है।
यह उदाहरण काफी हद तक 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...
शायद डेटा उस तरह का शब्द "config" में नहीं जा सकता है; इसे डीबी – Dor
में स्टोर करें, जब आप मेरे प्रश्न की आवश्यकताओं को अधिक निकटता से पूरा करते हैं तो आपने एरिकपेरिक के उत्तर को सबसे अच्छे जवाब के रूप में क्यों चुना? ऐसा नहीं है कि मैं एरिकपेरिक प्रतिनिधि अंक देना नहीं चाहता हूं। मैं सिर्फ उत्सुक हूं कि आपको क्यों लगा कि उसका जवाब बेहतर जवाब था? –
मैंने मूल रूप से सोचा था कि जब तक मैंने आपके अपडेट किए गए संस्करण को नहीं देखा तब तक उनका समाधान काफी साफ था। 'ArrayObject' का उपयोग करना कुछ ऐसा है जो मैंने पहले कभी नहीं किया है, निश्चित रूप से इसे देखने की ज़रूरत है! – Industrial