PHP: Erkennung, wenn die den Wert einer Variablen geändert wurde

Ich Frage mich, ob es einen Weg gibt, etwas wie einen change-listener in eine variable. Das einfachste Beispiel, was ich meine, wäre die Arbeit etwas entlang diesen Linien;

//Start with a variable
$variable = "some value";

//Define a listener
function myChangeListener($variable) {
    //encode with json_encode and send in cookie
}

//Add my listener to the variable
addListenerToVariable(&$variable, 'myChangeListener');

//Change the variables value, triggering my listener
$variable = "new value";

Nun werden Sie wahrscheinlich Fragen, warum in der Welt würde ich auch brauchen, um die Mühe mit diesem Ansatz, warum nicht einfach machen, eine Funktion zum festlegen der cookie. Die Antwort ist, ich habe eine &__get($var) Magische Methode gibt eine Referenz auf ein mehrdimensionales array-element, und ich bin der Hoffnung, etwas zu verwenden, wie dies zu erkennen, wenn/wenn das array-element oder eines seiner Kinder bearbeitet wurde, wird dann ein cookie senden, wenn er hat. Die erhofften Ergebnis arbeiten würde, so etwas wie dieses;

$cookies->testArray["test"] = "newValue";
//This would send the cookie 'testArray' with the value '{"test":"newValue"}'

Ich ehrlich gesagt erwarten, dass dies völlig unmöglich sein, und ich entschuldige mich, wenn ich mich nicht Irre. Aber ich habe gerade gelernt, wie man Referenzen richtig gestern, also ich dachte, ich würde Fragen, bevor ich komplett abschreiben die Idee.

Danke für alle Antworten, die ich bekommen, werden Sie, was ich erhofft oder was ich erwartet habe.

EDIT:

Für zusätzliche Klarheit, hier eine Beispiel Klasse für das, was ich versuche zu erreichen;

class MyCookies {
    private $cookies = array();
    private $cookieTag = "MyTag";

    public function __construct() {
        foreach($_COOKIE as $cookie => $value) {
            if(strlen($cookie)>strlen($this->cookieTag."_")&&substr($cookie,0,strlen($this->cookieTag."_"))==$this->cookieTag."_") {
                $cookieVar = substr($cookie,strlen($this->cookieTag."_"));
                $this->cookies[$cookieVar]['value'] = json_decode($value);
            }
        }
    }

    //This works great for $cookies->testArray = array("testKey" => "testValue");
    //but never gets called when you do $cookies->testArray['testKey'] = "testValue";
    public function __set($var, $value) {
        if(isset($value)) {
            $this->cookies[$var]['value'] = $value;
            setcookie($this->cookieTag.'_'.$var,json_encode($value),(isset($this->cookies[$var]['expires'])?$this->cookies[$var]['expires']:(time()+2592000)),'/','');
        } else {
            unset($this->cookies[$var]);
            setcookie($this->cookieTag.'_'.$var,'',(time()-(172800)),'/','');
        }
        return $value;
    }

    //This gets called when you do $cookies->testArray['testKey'] = "testValue";
    public function &__get($var) {
        //I want to add a variable change listener here, that gets triggered
        //when the references value has been changed.

        //addListener(&$this->config[$var]['value'], array(&$this, 'changeListener'));

        return $this->config[$var]['value'];
    }

    /*
    public function changeListener(&$reference) {
        //scan $this->cookies, find the variable that $reference is the reference to (don't know how to do that ether)
        //send cookie
    }
    */

    public function __isset($var) {
        return isset($this->cookies[$var]);
    }

    public function __unset($var) {
        unset($this->cookies[$var]);
        setcookie($this->cookieTag.'_'.$var,'',(time()-(172800)),'/','');
    }

    public function setCookieExpire($var, $value, $expire=null) {
        if(!isset($expire)) {
            $expire = $value;
            $value = null;
        }
        if($expire<time()) $expire = time() + $expire;
        if(isset($value)) $this->cookies[$var]['value'] = $value;
        $this->cookies[$var]['expires'] = $expire;
        setcookie($this->cookieTag.'_'.$var,json_encode((isset($value)?$value:(isset($this->cookies[$var]['value'])?$this->cookies[$var]['value']:''))),$expire,'/','');
    }
}

Als für, warum ich nicht wollen, um eine update-Funktion, es ist wirklich nur eine persönliche Präferenz. Dieser ist noch in einem framework, das anderen Menschen erweitern können, und ich denke, dass Sie in der Lage sein, um die Behandlung von cookies, die nur Variablen in den einzelnen code-Zeilen fühlt sich glatter.

  • Ich glaube nicht, dass dies möglich ist, in php. Für benutzerdefinierte Klassen implementieren die SplObserver-Schnittstelle kann eine option sein, aber Sie haben zu Benachrichtigen, wenn Sie eine änderung vornehmen.
  • Ich Verstand nicht, was Ihre Magie get-Methode hat damit zu tun. Auch dein zweites code-Beispiel scheint nicht zu viel zu tun haben, mit Ihrem ersten. Ich denke, bessere code-Beispiele würde klären, die Dinge für mich. Ich werde nur werfen etwas in der Hoffnung, es geht in die richtige Richtung: __set()?! So können Sie sehen, Wann die variable geändert wird, zu. Aber ich werde in der Lage sein zu helfen, besser, wenn ich wirklich wissen, was Sie wollen. PHP stellt einige Funktionen für die Zuhörer.
  • Ich aktualisiert meine Frage mit einem Beispiel-Klasse.
InformationsquelleAutor MrFigg | 2013-05-22
Schreibe einen Kommentar