【发布时间】:2020-04-05 00:26:21
【问题描述】:
我需要这样做,但要避免重复调用 startTransaction 和 stopTransaction:
<?php
//parent: let's supply transactions!
class MegaParent {
public $__started;
//code inside this method must be executed only once - at first call
public function startTransaction()
{
if (!$this->__started) {
echo "Transaction Started\n";
$this->__started = true;
}
}
//code inside this method must be executed only once - at last call
public function stopTransaction()
{
if ($this->__started) {
echo "Transaction Stopped\n";
$this->__started = null;
}
}
}
//Child 1: I do something wrapped in transaction
class ChildOne extends MegaParent {
public function doer()
{
$this->startTransaction();
echo "Doing ChildOne\n";
$this->stopTransaction();
}
}
//Child 2: I do something in transaction too but I need no nested transactions
class ChildTwo extends ChildOne {
public function doer()
{
$this->startTransaction();
parent::doer();
parent::doer();
echo "Doing ChildTwo\n";
$this->stopTransaction();
}
}
(new ChildTwo)->doer();
结果:
Transaction Started
Doing ChildOne
Transaction Stopped
Transaction Started
Doing ChildOne
Transaction Stopped
Doing ChildTwo
如何得到这样的结果:
Transaction Started
Doing ChildOne
Doing ChildOne
Doing ChildTwo
Transaction Stopped
?
【问题讨论】:
-
抱歉,我看到了这个问题。将
static内存用于$__started。 -
我无法解决静态调用的问题,但似乎我使用你关于堆栈的想法得到了结果。
-
由于 static 和 $this 之间的上下文差异,
public static $__started;将使用static::$__started而不是$this->$__started解决您的问题。 -
@AlexBarker,请展示您可以正常工作的整个代码
标签: php architecture transactions