fireweasel: Dann benutz' halt Objekte statt Arrays

Beitrag lesen

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. ;-)