変更リスナーのようなものを変数に追加する方法があるかどうか疑問に思っていました。私が言いたいことの最も単純な例は、これらの線に沿って何かを機能させるでしょう。
// 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";
おそらく、なぜ私はこのアプローチを気にする必要があるのか 、なぜクッキーを設定する関数を作成しないのかと尋ねているでしょう。答えは&__get($var)
、多次元配列要素への参照を返す魔法のメソッドを持っていることです。このようなものを使用して、配列要素またはその子の 1 つがいつ編集されたかを検出し、送信したいと考えています。ある場合はクッキー。期待される結果は次のようになります。
$cookies->testArray["test"] = "newValue";
// This would send the cookie 'testArray' with the value '{"test":"newValue"}'
正直なところ、これは完全に不可能であると予想しており、私が正しければ申し訳ありません。しかし、昨日参照を正しく使用する方法を学んだばかりなので、アイデアを完全に破棄する前に質問することにしました.
私が望んでいたものであろうと期待していたものであろうと、私が得た反応に感謝します。
編集:
わかりやすくするために、私が達成しようとしているクラスの例を次に示します。
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,'/','');
}
}
なぜアップデート機能を使いたくないのかというと、あくまで個人的な好みです。これは、他の人が拡張できるフレームワークで使用される予定であり、Cookie を 1 行のコードで単なる変数として扱うことができるようにすると、より洗練されたものになると思います。