- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想知道是否有办法向变量添加类似更改监听器的内容。我的意思的最简单示例将按照这些思路工作;
// 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";
现在您可能会问为什么我什至需要费心使用这种方法,为什么不创建一个函数来设置 cookie。答案是我有一个 &__get($var)
魔术方法返回对多维数组元素的引用,我希望使用类似这样的东西来检测数组何时/是否元素或其子元素之一已被编辑,如果有,则发送一个 cookie。希望的结果会像这样工作;
$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 视为单行代码中的变量感觉更巧妙。
最佳答案
如果你想在数组或其他任何东西中实现自己的事件处理程序/触发器,那么你可以使用类包装器。
对于一个变量 __get()
和__set()
魔术方法就足够了,如您所见。对于数组,有一个更好的处理程序:ArrayAccess
.它允许使用类方法和通用数组语义(如某些其他语言中的集合)模拟数组操作。
<?php
header('Content-Type: text/plain');
// ArrayAccess for Array events
class TriggerableArray implements ArrayAccess {
protected $array; // container for elements
protected $triggers; // callables to actions
public function __construct(){
$this->array = array();
// predefined actions, which are availible for this class:
$this->triggers = array(
'get' => null, // when get element value
'set' => null, // when set existing element's value
'add' => null, // when add new element
'exists' => null, // when check element with isset()
'unset' => null // when remove element with unset()
);
}
public function __destruct(){
unset($this->array, $this->triggers);
}
public function offsetGet($offset){
$result = isset($this->array[$offset]) ? $this->array[$offset] : null;
// fire "get" trigger
$this->trigger('get', $offset, $result);
return $result;
}
public function offsetSet($offset, $value){
// if no offset provided
if(is_null($offset)){
// fire "add" trigger
$this->trigger('add', $offset, $value);
// add element
$this->array[] = $value;
} else {
// if offset exists, then it is changing, else it is new offset
$trigger = isset($this->array[$offset]) ? 'set' : 'add';
// fire trigger ("set" or "add")
$this->trigger($trigger, $offset, $value);
// add or change element
$this->array[$offset] = $value;
}
}
public function offsetExists($offset){
// fire "exists" trigger
$this->trigger('exists', $offset);
// return value
return isset($this->array[$offset]);
}
public function offsetUnset($offset){
// fire "unset" trigger
$this->trigger('unset', $offset);
// unset element
unset($this->array[$offset]);
}
public function addTrigger($trigger, $handler){
// if action is not availible and not proper handler provided then quit
if(!(array_key_exists($trigger, $this->triggers) && is_callable($handler)))return false;
// assign new trigger
$this->triggers[$trigger] = $handler;
return true;
}
public function removeTrigger($trigger){
// if wrong trigger name provided then quit
if(!array_key_exists($trigger, $this->triggers))return false;
// remove trigger
$this->triggers[$trigger] = null;
return true;
}
// call trigger method:
// first arg - trigger name
// other args - trigger arguments
protected function trigger(){
// if no args supplied then quit
if(!func_num_args())return false;
// here is supplied args
$arguments = func_get_args();
// extract trigger name
$trigger = array_shift($arguments);
// if trigger handler was assigned then fire it or quit
return is_callable($this->triggers[$trigger]) ? call_user_func_array($this->triggers[$trigger], $arguments) : false;
}
}
function check_trigger(){
print_r(func_get_args());
print_r(PHP_EOL);
}
function check_add(){
print_r('"add" trigger'. PHP_EOL);
call_user_func_array('check_trigger', func_get_args());
}
function check_get(){
print_r('"get" trigger'. PHP_EOL);
call_user_func_array('check_trigger', func_get_args());
}
function check_set(){
print_r('"set" trigger'. PHP_EOL);
call_user_func_array('check_trigger', func_get_args());
}
function check_exists(){
print_r('"exists" trigger'. PHP_EOL);
call_user_func_array('check_trigger', func_get_args());
}
function check_unset(){
print_r('"unset" trigger'. PHP_EOL);
call_user_func_array('check_trigger', func_get_args());
}
$victim = new TriggerableArray();
$victim->addTrigger('get', 'check_get');
$victim->addTrigger('set', 'check_set');
$victim->addTrigger('add', 'check_add');
$victim->addTrigger('exists', 'check_exists');
$victim->addTrigger('unset', 'check_unset');
$victim['check'] = 'a';
$victim['check'] = 'b';
$result = $victim['check'];
isset($victim['check']);
unset($victim['check']);
var_dump($result);
?>
显示:
"add" trigger
Array
(
[0] => check
[1] => a
)
"set" trigger
Array
(
[0] => check
[1] => b
)
"get" trigger
Array
(
[0] => check
[1] => b
)
"exists" trigger
Array
(
[0] => check
)
"unset" trigger
Array
(
[0] => check
)
string(1) "b"
我假设,您可以使用数组引用参数 修改此代码中的构造函数,以便能够向那里传递超全局数组,如$_COOKIE
。另一种方法是直接在类中将 $this->array
替换为 $_COOKIE
。此外,还有一种方法可以用 anonymous functions 替换可调用文件。 .
关于PHP:检测变量值何时被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16682355/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!