hi,
ho,
ausgehend davon, dass an der Stelle
$arr['foo'];
für 'foo' ohnehin ein String erwartet wird, wär's doch schön, wenn eine Schreibweise$arr[foo];
genügen würde. Gibt es irgendwo eine Konfigurations-Einstellung mit der das voreingestellt werden kann?
Nö, aber du kannst "anonyme" Objekte benutzen. Die sparen zwar nix bei der Erzeugung ...
$obj = (object) array (
'foo' => 'fred',
'bar' => 'barney'
);
..., wohl aber beim Zugriff ...
echo $blurb->dum;
Noch besser dann auch sowas:
$currency = array( de => 'Euro', en => 'Pfunde', us => 'Dollar');
Hier ein (nicht wirklich schöner) Vorschlag:
~~~php
class assoc {
static function make() {
return new static();
}
function __get($var) {
// fuer eine genauer zielende Fehleranzeige
//if (!property_exists($this, $var)) {
// throw new Exception("Undefined property '$var'");
//}
return $this->$var;
}
function __call($name, $args = null) {
if (is_array($args)) {
$this->$name = current($args);
}
else {
$this->__call = $name;
}
return $this;
}
}
Das kannst du dann so anwenden:
// Objekt erzeugen
$currency = assoc::make()
// und Unfug zuweisen
->de('Teuro')
->en('Kilo/2')
->dd('Kosakendollar')
->__call('häh?');
// und ohne Funktionsaufruf wieder abfragen
var_dump($currency->en);
var_dump($currency->us);
Das Ganze hat auch noch laufzeittechnische Änderungen (im Gegensatz zum Array-Zugriff) zur Folge. Aber wenn du mit einer vernünftigen Scriptsprache hättest arbeiten wollen, wärst du sicher bei Perl geblieben. ;-)