使用递归函数时的PHP参考变量

问题描述 投票:0回答:1

我有2个递归函数来计算期初和期末库存。

public function getClosingStock($previousStock, $product, $periodType, $lower, $upper)
{
    $diffPeriod = 'diffIn' . Str::plural($periodType);
    $addPeriod = "add{$periodType}";

    $totalStocked = $this->getTotalStockInPeriod($product, $periodType, $lower);
    $totalIssued = $this->getTotalIssueInPeriod($product, $periodType, $lower);

    $currentStock = $previousStock + $totalStocked - $totalIssued;

    if ($upper->$diffPeriod($lower) > 0)
    {
        $currentStock = $this->getClosingStock(
            $currentStock, $product, $periodType, $lower->$addPeriod(), $upper
        );
    }

    return $currentStock;
}
public function getOpeningStock($previousStock, $product, $periodType, $lower, $upper)
{
    $subPeriod = "sub{$periodType}";

    return $this->getClosingStock($previousStock, $product, $periodType, $lower, $upper->$subPeriod());
}

[基本上,这两个函数从有界的下限时间到有界的上限时间计算库存。例如,边界下限是2019年12月16日,边界上限是2020年3月31日。因此他们将计算3月的期初和期末存货。


$lower = Carbon::parse('2019-12-16');
$upper = Carbon::parse('2020-03-31');

echo $lower->toDateString() . '<br>'; // Print out: 2019-12-16
echo $upper->toDateString() . '<br>'; // Print out: 2020-03-31

$opening = $this->getOpeningStock(
    0, $product, 'month', $lower, $upper
);

echo $lower->toDateString() . '<br>'; // Print out: 2020-02-16
echo $upper->toDateString() . '<br>'; // Print out: 2020-02-29

$closing = $this->getClosingStock(
    0, $product, 'month', $lower, $upper
);

问题是我运行getOpeningStock函数后,更改了2个变量$lowerupper,它们没有保留我一开始设置的原点值。您可以在以上代码中的注释中看到差异。造成差异的原因是什么?

谢谢!

php laravel recursion pass-by-reference
1个回答
0
投票

克隆$lower$upper,并在克隆的副本上调用$addPeriod()$subPeriod(),然后递归传递它们:

public function getClosingStock($previousStock, $product, $periodType, $lower, $upper)
{
    $diffPeriod = 'diffIn' . Str::plural($periodType);
    $addPeriod = "add{$periodType}";

    $totalStocked = $this->getTotalStockInPeriod($product, $periodType, $lower);
    $totalIssued = $this->getTotalIssueInPeriod($product, $periodType, $lower);

    $currentStock = $previousStock + $totalStocked - $totalIssued;

    if ($upper->$diffPeriod($lower) > 0)
    {
    $cloned_lower = clone $lower;
    $currentStock = $this->getClosingStock(
        $currentStock, $product, $periodType, $cloned_lower->$addPeriod(), $upper
    );
    }

    return $currentStock;
}

public function getOpeningStock($previousStock, $product, $periodType, $lower, $upper)
{
    $subPeriod = "sub{$periodType}";

    $cloned_upper = clone $upper;
    return $this->getClosingStock($previousStock, $product, $periodType, $lower, $cloned_upper->$subPeriod());
}
© www.soinside.com 2019 - 2024. All rights reserved.