Witam,
Zastanawiam sie ostatnio, co jest lepszym rozwiazaniem w perspektywie wiekszej aplikacji:
<?php
$aConfig['system']['db']['host'] = '127.0.0.1';
$oConfig = new Config($aConfig);
// Rozwiazanie 1.
$host = $oConfig->system->db->host;
// Rozwiazanie 2.
$host = $oConfig->get('system', 'db', 'host');
?>
Moim zdaniem pierwsze rozwiazanie jest 'ladniejsze' i duzo bardziej wygodne. No i zaczynaja sie schody:
<?php
$host = $oConfig->system->jakas_nieistniejaca_zmienna->host;
// Zwroci NOTICE informuujace o tym, ze nastepuja odwolanie do nieistniejacego obi
ektu - no bo zachowa sie jak: null->host;
$host = $oConfig->get('System', 'nieistneijaca_zmienna', 'host');
// Zwroci po prostu null bez zadnego bladu.
?>
Ok. pojawia sie magiczne __isset(). Ale:
<?php
var_dump(isset($oConfig->db->host)); // zwroci false, ale tak naprawde metoda __isset nie zostanie wywolana (?)
var_dump(isset($oConfig->db->cos->host)) // zwroci false i wyswietli Notice: odwolanie do nieistniejacego obiektu. ?>
Kod:
<?php
class ParametersHolder
{
private $_aParameters;
private $_bValidIterationPointer;
public function __construct
($aParameters = array()) {
foreach($aParameters as $sKey => $mValue)
{
$this->_aParameters[$sKey] = new ParametersHolder($mValue);
else
$this->_aParameters[$sKey] = $mValue;
}
}
public function __get($sParameter)
{
return isset($this->_aParameters
[$sParameter]) ?
$this->_aParameters
[$sParameter] : null; }
public function __set($sParameter, $mValue)
{
$this->_aParameters[$sParameter] = new ParametersHolder($mValue);
else
$this->_aParameters[$sParameter] = $mValue;
}
public function __isset($sParameter)
{
return isset($this->_aParameters
[$sParameter]); }
}
?>
Co o tum uwazacie? Moze macie lepszy sposob?
Adrian.