PHP是否存在检测变量变化的函数? 这是这样的:
//called when $a is changed.
function variableChanged($value) {
echo "value changed to " . $value;
}
$a = 1;
//attach the variable to the method.
$a.attachTo("variableChanged");
$a = 2;
$a = 3;
//expected output:
//value changed to 2
//value changed to 3
我知道如果我使用" setter"它很容易实现。方法。但由于我正在处理一些现有代码,我无法修改它们。有人能告诉我如何实现我的目的吗?感谢。
答案 0 :(得分:5)
知道如果我使用“setter”方法很容易实现。但由于我正在处理一些现有代码,我无法对其进行修改。
我假设您可以更改某些代码,但不能更改您正在使用的对象/类。如果你根本无法改变任何代码,这个问题将毫无用处。
您可以做的是创建自己的课程,扩展您正在使用的课程,并在那里添加您的二传手。出于所有目的,您无法覆盖父设置,除了您需要跟踪的任何魔术设置器。跟踪更改,然后调用父函数,因此任何其他内部工作的更改都不会生效。
答案 1 :(得分:3)
这只能通过将变量包装在一个类中,并自己实现一个onchange来实现。
即
class MyVarContainer {
var $internalVar = array();
function __get($name) {
return !empty($this->internalVar[$name]) $this->internalVar[$name] ? FALSE;
}
function __set($name, $value) {
$oldval = $this->$name;
$this->internalVar[$name] = $value;
if($oldval !== FALSE) {
onUpdated($name, $oldval, $value);
} else {
onCreated($name, $value);
}
}
function onCreated($name, $value) {
}
function onUpdated($name, $oldvalue, $newvalue) {
}
}
答案 2 :(得分:1)
除了使用debugger
:
SplObserver接口与SplSubject一起使用来实现 观察者设计模式。 http://www.php.net/manual/en/class.splobserver.php
或魔术方法__get()
和__set()
:将变量封装到一个类中,您可以自己实现一个事件处理程序并注册变量的变化。 您也可以附加此类回调:
<?php
header("content-type: text/plain");
class WatchVar {
private $data = array();
private $org = array();
private $callbacks = array();
public function __set($name, $value) {
if (!array_key_exists($name, $this->data)) {
$this->org[$name] = $value;
} else {
//variable gets changed again!
$this->triggerChangedEvent($name, $value);
}
$this->data[$name] = $value;
}
public function &__get($name) {
if (array_key_exists($name, $this->data)) {
if ($this->data[$name] != $this->org[$name]) {
//variable has changed, return original
//return $this->org[$name];
//or return new state:
return $this->data[$name];
} else {
//variable has not changed
return $this->data[$name];
}
}
}
public function addCallback($name, $lambdaFunc) {
$this->callbacks[$name] = $lambdaFunc;
}
protected function triggerChangedEvent($name, $value) {
//$this->data[$name] has been changed!
//callback call like:
call_user_func($this->callbacks[$name], $value);
}
}
$test = new WatchVar;
$test->addCallback('xxx', function($newValue) { echo "xxx has changed to {$newValue}\n"; });
$test->xxx = "aaa";
echo $test->xxx . "\n";
//output: aaa
$test->xxx = "bbb";
//output: xxx has changed to bbb
echo $test->xxx . "\n";
//output bbb
function messyFunction(&$var) {
$var = "test";
}
messyFunction($test->xxx);
//output:
答案 3 :(得分:1)
您可以像这样简单地修改代码,以产生您想要的预期输出。
function variableChanged($value) {
return "value changed to " . $value;
}
$a = 1;
echo $a = variableChanged(2);
echo '<br/>';
echo $a = variablechanged(3);
=================
//output
value changed to 2
value changed to 3
或使用像这样的类....
class VariableHandler{
private $Variable;
function setVariable($initialValue = NULL){
$this->Variable = $initialValue;
return $initialValue;
}
function changeValue($newValue = NULL){
$this->Variable = $newValue;
return "value has change to ". $newValue;
}
}
$var = new VariableHandler;
echo $a = $var->setVariable(1);
echo '<br/>';
echo $var->changeValue(2);
echo '<br/>';
echo $var->changeValue(3);
=================
//output
value changed to 2
value changed to 3
答案 4 :(得分:0)
下载此文件 margin collapse
我创建了这个
将我的文件包含到您的php文件中
require_once("k_dev.php");
如果您使用wordpress
$is_wp = true;
如果您不使用wordpress
$is_wp = false;
如果您创建或设置变量,请添加
changed_var($VAR_NAME);
此变量之后。
示例:
require_once("k_dev.php");
$is_wp = false;
$var1 = "test";
changed_var($var1);
$var1 = "test1";
changed_var($var1);
if(changed_var($var1) == true){
echo "it's changed";
}
我是Khaled开发人员