- var_dump: documentation ( source)
<?php
class State {
protected $foo;
protected $bar;
public function getFoo() {
return $this->foo;
}
public function getBar() {
return $this->bar;
}
public final function setFoo($foo) {
$this->foo = $foo;
}
public final function setBar($bar) {
$this->bar = $bar;
}
public final function transaction(callable $function) {
$proxy = new StateProxy($this);
if (call_user_func($function, $proxy)) {
$proxy->commit();
}
unset($proxy);
}
}
class StateProxy extends State {
protected $state;
public function __construct(State $state) {
$this->state = $state;
}
public function getFoo() {
return parent::getFoo() ? : $this->state->getFoo();
}
public function getBar() {
return parent::getBar() ? : $this->state->getBar();
}
public function commit() {
$this->state->foo = $this->foo;
$this->state->bar = $this->bar;
}
}
$state = new State();
$state->setFoo('abc');
$state->setBar('123');
var_dump($state);
$state->transaction(function(StateProxy $proxy) {
$proxy->setFoo('def');
$proxy->setBar('456');
return true;
});
var_dump($state);
$state->transaction(function(StateProxy $proxy) {
$proxy->setFoo('ghi');
$proxy->setBar('789');
return false;
});
var_dump($state);
$state = new State();
$state->setFoo('abc');
$state->setBar('123');
$state->transaction(function(StateProxy $proxy) {
$proxy->transaction(function(StateProxy $proxy) {
$proxy->transaction(function(StateProxy $proxy) {
$proxy->transaction(function(StateProxy $proxy) {
$proxy->setFoo('def');
$proxy->setBar('456');
return false;
});
$proxy->transaction(function(StateProxy $proxy) {
$proxy->setFoo('ghi');
$proxy->setBar('789');
return true;
});
return true;
});
$proxy->transaction(function(StateProxy $proxy) {
$proxy->setFoo('jkl');
$proxy->setBar('012');
return false;
});
return true;
});
return true;
});
var_dump($state);