Frage

Ich möchte in der Lage sein, eine PHP-Klasse zu schreiben, die wie ein Array verhält und nutzen normale Array-Syntax für das Erhalten und Einstellung.

Zum Beispiel (wo Foo ist eine PHP-Klasse meiner Herstellung):

$foo = new Foo();

$foo['fooKey'] = 'foo value';

echo $foo['fooKey'];

Ich weiß, dass PHP die _get und _SET magische Methoden hat aber diejenigen, die Sie Array-Notation lassen Sie sich nicht verwenden, um Elemente zuzugreifen. Python behandelt sie durch __ __getitem__ und __setitem Überlastung.

Gibt es eine Möglichkeit, dies in PHP zu tun? Wenn es einen Unterschied macht, ich bin mit PHP 5.2.

War es hilfreich?

Lösung

Wenn Sie erweitern ArrayObject oder implementieren ArrayAccess dann können Sie tun, was Sie wollen.

Andere Tipps

Nein, Gießen führt nur in einem normalen PHP-Array - zu verlieren, was Funktionalität Ihre Arrayobject abgeleiteten Klasse hatte. Check this out:

class CaseInsensitiveArray extends ArrayObject {
    public function __construct($input = array(), $flags = 0, $iterator_class =     'ArrayIterator') {
        if (isset($input) && is_array($input)) {
            $tmpargs = func_get_args();
            $tmpargs[0] = array_change_key_case($tmpargs[0], CASE_LOWER);
            return call_user_func_array(array('parent', __FUNCTION__), $tmp    args);
        }
        return call_user_func_array(array('parent', __FUNCTION__), func_get_args());
    }

    public function offsetExists($index) {
        if (is_string($index)) return parent::offsetExists(strtolower($index));
        return parent::offsetExists($index);
    }

    public function offsetGet($index) {
        if (is_string($index)) return parent::offsetGet(strtolower($index));
        return parent::offsetGet($index);
    }

    public function offsetSet($index, $value) {
        if (is_string($index)) return parent::offsetSet(strtolower($index, $value));
        return parent::offsetSet($index, $value);
    }

    public function offsetUnset($index) {
        if (is_string($index)) return parent::offsetUnset(strtolower($index));
        return parent::offsetUnset($index);
    }
}

$blah = new CaseInsensitiveArray(array(
    'A'=>'hello',
    'bcD'=>'goodbye',
    'efg'=>'Aloha',
));

echo "is array: ".is_array($blah)."\n";

print_r($blah);
print_r(array_keys($blah));

echo $blah['a']."\n";
echo $blah['BCD']."\n";
echo $blah['eFg']."\n";
echo $blah['A']."\n";

Wie erwartet, nicht die array_keys () -Aufruf. Darüber hinaus gibt is_array ($ blah) falsch. Aber wenn Sie die Konstruktor Zeile ändern:

$blah = (array)new CaseInsensitiveArray(array(

dann erhalten Sie nur einen normalen PHP-Array (is_array ($ blah) true zurückgibt, und array_keys ($ blah funktioniert)), aber die gesamte Funktionalität des Arrayobject abgeleitete Unterklasse verloren geht (in diesem Fall, Groß- und Kleinschreibung Tasten funktionieren nicht mehr). Versuchen Sie den obigen Code in beide Richtungen ausgeführt wird, und Sie werden sehen, was ich meine.

sollte PHP entweder bietet eine native Array, in dem der Schlüssel Groß- und Kleinschreibung ist, oder Arrayobject zu Array gießbar sein, ohne die Unterklasse implementiert zu verlieren was Funktionalität, oder einfach nur alle Array-Funktionen Arrayobject macht Instanzen akzeptieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top