2

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”方法很容易实现。但由于我正在处理一些现有代码,我无法修改它们。有人可以告诉我如何实现我的目的吗?谢谢。

4

5 回答 5

5

知道如果我使用“setter”方法很容易实现。但由于我正在处理一些现有代码,我无法修改它们。

我假设您可以更改一些代码,但不能更改您正在使用的对象/类。如果您根本无法更改任何代码,那么这个问题将毫无用处。

您可以做的是创建自己的类,扩展您正在使用的类,并在那里添加您的设置器。出于所有目的,您不能覆盖父设置,除了您需要跟踪的任何东西的魔术设置器。跟踪更改,然后调用父函数,因此任何其他内部工作的更改都不会生效。

于 2013-07-09T08:13:14.717 回答
3

这只能通过将变量包装在一个类中并自己实现 onchange 来实现。

IE。

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) {

    }
}
于 2013-07-09T08:16:02.357 回答
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:
于 2013-07-09T08:16:26.123 回答
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
于 2013-07-09T08:20:04.237 回答
0

下载此文件 点击下载

我创造了这个

将我的文件包含到您的 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 开发者

于 2020-07-19T07:56:01.120 回答