Является ли 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
Я знаю, что это легко достичь, если я использую метод «сеттер». Но поскольку я работаю над некоторыми существующими кодами, я не могу их модифицировать. Может ли кто-нибудь сказать мне, как достичь моей цели? Благодарю.
что это легко достичь, если я использую метод «сеттер». Но поскольку я работаю над некоторыми существующими кодами, я не могу их модифицировать.
Я предполагаю, что вы можете изменить какой-то код, но не объект / класс, с которым вы работаете. Если вы вообще не можете изменить какой-либо код, этот вопрос будет бесполезным.
То, что вы можете сделать, это сделать свой собственный класс, расширяя класс, с которым вы работаете, и добавив там свой сеттер. Для всех целей вы не можете переопределить родительский параметр, за исключением волшебного сеттера на все, что вам нужно отслеживать. Отслеживайте изменения, а затем вызывайте родительские функции , поэтому никаких изменений в каких-либо других внутренних действиях не будет.
Это может быть достигнуто только путем переноса переменной внутри класса и реализации 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) { } }
Вы могли бы изменить свой код так же просто, как это сделать, чтобы получить ожидаемый результат, который вы хотите.
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
Помимо использования debugger
:
Интерфейс SplObserver используется вместе с SplSubject для реализации шаблона проектирования Observer. 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: