Frage

Problem:

ArrayObject funktioniert wie erwartet, wenn die Werte manuell festgelegt oder gelesen werden. Wenn sie jedoch eine Funktion (z.

Es wird nicht die von mir definierten Versatzmethoden aufgerufen, sondern verwendet stattdessen die Arrayiterator -Methoden.

Code:

Die Klasse:

class obsecureArray extends ArrayObject {


    public function offsetSet($name, $value) {
        call_user_func_array(array('parent', __FUNCTION__), array(base64_encode($name), base64_encode($value)) );
    }

    public function offsetGet($name) {
        return base64_decode( call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name) ) );
    }

    public function offsetExists($name) {
        return call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name) );
    }

    public function offsetUnset($name) {
        return call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name) );
    }
}

Verwendungsbeispiel:

$a = new obsecureArray();
$a['test'] = 'Value';
$a[2] = '1';

define('BR','<br />');
echo 'test: ',$a['test'],BR,'2: ',$a[2],BR;

foreach($a as $key => $value)
    echo 'Key: ',$key,' Value:',$value,BR;

Ausgabe:

test: Value
2: 1
Key: dGVzdA== Value:VmFsdWU=
Key: Mg== Value:MQ==

Codepad -Beispiel.

War es hilfreich?

Lösung

Ich schaue in die ArrayObject __construct Methode Dokumentation und fand das dritte Argument in Bezug auf mein Problem:

iterator_class:

Geben Sie die Klasse an, die zur Iteration des ArrayObject -Objekts verwendet wird. Arrayiterator ist die verwendete Standardklasse.

Jetzt konnte ich eine erweitern ArrayIterator mit meinem eigenen offset* Methoden und übergeben es an meinen Konstruktor von ArrayObject, Also schaute ich mir an ArrayIterator und es war fast identisch mit dem ArrayObject außer dass es offensichtlich keinen externen Iterator verwendet hat. Alles was ich tun musste war sich zu verlängern ArrayIterator stattdessen. und musste die außerordentlich außer Kraft setzen current und key Methode auch.

So dass ich:

class obsecureArray extends ArrayIterator {

    public function offsetSet($name, $value) {
        call_user_func_array(array('parent', __FUNCTION__), array(base64_encode($name), base64_encode($value)));
    }

    public function offsetGet($name) {
        return base64_decode(call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name)));
    }

    public function offsetExists($name) {
        return call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name));
    }

    public function offsetUnset($name) {
        return call_user_func_array(array('parent', __FUNCTION__), (array) base64_encode($name));
    }

    public function key() {
        return base64_decode(parent::key());
    }

    public function current() {
        return base64_decode(parent::current());
    }



}

Und es funktioniert perfekt wie erwartet.

und für:

$a = new obsecureArray();
$a['test'] = 'Value';
$a[2] = '1';

define('BR','<br />');
echo 'test: ',$a['test'],BR,'2: ',$a[2],BR;

foreach($a as $key => $value)
    echo 'Key: ',$key,' Value:',$value,BR;

Ich habe:

test: Value
2: 1
Key: test Value:Value
Key: 2 Value:1

Codepad -Beispiel

Andere Tipps

Sie möchten implementieren Iterator oder Iteratoraggregate. Sie haben mehr Kontrolle über die ersteren, aber letzteres ist einfacher zu implementieren (wahrscheinlich mit mehr Overhead):

class People implements IteratorAggregate {
    protected $children;

    // ...

    public function getIterator() {
        return new ArrayIterator( $this->children );
    }
}

Siehe das Iterator Für Kesselplattenmethoden für diese Schnittstelle.

Meiner Meinung nach funktioniert Ihr Code wie erwartet, wenn Sie sicherstellen möchten, dass Ihre Werte ordnungsgemäß richtige Methoden verwenden:

$a = new obsecureArray();
$a->offsetSet('test', 'Value');
$a->offsetSet(2, '1');

auch statt von

define('BR','
');

Es gibt eine vordefinierte PHP -Eigenschaft PHP_EOL

Sie müssen eine benutzerdefinierte Iteratorklasse festlegen:

<?php

class SecureArray extends ArrayObject {

    public function __construct($array = array()) {
        parent::__construct($array);
        $this->setIteratorClass('SecureIterator');
    }

    public function offsetSet($name, $value) {
        parent::offsetSet( base64_encode($name), base64_encode($value) );
    }

    public function offsetGet($name) {
        return base64_decode( parent::offsetGet( base64_encode($name) ) );
    }

    public function offsetExists($name) {
        return parent::offsetExists( base64_encode($name) );
    }

    public function offsetUnset($name) {
        return parent::offsetUnset( base64_encode($name) );
    }
}

class SecureIterator extends ArrayIterator {

    function current() {
        return base64_decode(parent::current());
    }

    function key() {
        return base64_decode(parent::key());
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top