如何在PHP第二个函数中调用第一个函数的$r变量
解决方案:提取$r计算逻辑为可复用函数
你的问题核心是变量作用域隔离:第一个代码块中的$r是局部变量,无法被第二个代码块直接访问。解决思路是将计算$r的逻辑封装成独立函数,在需要的地方调用该函数获取$r的值,同时实现代码复用。
步骤1:封装计算$r的函数
将第一个代码块中计算$r的逻辑抽离为独立函数,接收计算所需的参数(发动机排量$eng和车辆价格$a):
function calculateBasicPremium($eng, $a) { // 定义计算常量 $z = .02034; $p = .01809; $q = .01779; $qr = .01737; $sma = 7325; $mid = 11975; $lar = 27930; $r = 0; if ($eng < 1000) { $r = ($z * $a) + $sma; } elseif ($eng >= 1000 && $eng < 1500) { $r = ($p * $a) + $mid; } elseif ($eng >= 1500 && $a < 1900000) { $r = ($q * $a) + $lar; } elseif ($eng >= 1500 && $a > 1900000) { $r = ($qr * $a) + $lar; } return $r; }
步骤2:修改第一个代码块
替换原有的$r计算逻辑,调用封装好的函数:
if($NewCarVariantDetail){ $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select($db->qn(array('id','v_price','v_fuel_type','v_capacity'))) ->from($db->qn('#__newprod_variants')) ->where([$db->qn('state') . ' = 1', $db->qn('id') . ' = ' . (int)$NewCarVariantDetail]) ->order('v_price/2 asc','v_fuel_type desc'); $db->setQuery($query); $rows = $db->loadObject(); $a = $rows->v_price; $b = $rows->v_fuel_type; $eng = $rows->v_capacity; // 调用函数获取$r $r = calculateBasicPremium($eng, $a); $list=' <div class="common-box"> <div class="common-box-left">Basic Prem</div> <div class="common-box-right"> <input name="voluntary_excess" type="text" class="text-box" value="Rs. '.(round($r)) .'" readonly=""/> </div> </div> '; die($list); }
步骤3:修改第二个代码块
同样调用封装函数获取$r,用于后续计算:
if($RtoDetail){ $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select($db->qn(array('id','v_price','v_fuel_type','v_capacity'))) ->from($db->qn('#__newprod_variants')) ->where([$db->qn('state') . ' = 1', $db->qn('id') . ' = ' . (int)$RtoDetail]); $db->setQuery($query); $rows = $db->loadObject(); $a = $rows->v_price; $b = trim($rows->v_fuel_type); $eng = $rows->v_capacity; $calculatedtax = ''; if (($a < 400000) && ($b == 'Petrol')) { $calculatedtax = (.04*$a); } elseif(($a >= 400000 && $a < 600000) && ($b == 'Petrol')) { $calculatedtax = (.05*$a); } elseif(($a >= 600000 && $a < 1000000) && ($b == 'Petrol')) { $calculatedtax = (.07*$a); } elseif(($a >= 1000000) && ($b == 'Petrol')) { $calculatedtax = (.10*$a); } // 调用函数获取$r $r = calculateBasicPremium($eng, $a); $list=' <h2><u> Fees </u></h2> <div class="common-box"> <div class="common-box-left">Total Fee </div> <div class="common-box-right"> <input name="roadtax" type="text" class="text-box" value="Rs. '.(round($calculatedtax)) .'" readonly=""/> </div> </div> <div class="common-box"> <div class="common-box-left">Basic Prem</div> <div class="common-box-right"> <input name="voluntary_excess" type="text" class="text-box" value="Rs. '.(round($r)) .'" readonly=""/> </div> </div> <div class="common-box"> <div class="common-box-left">Final Price </div> <div class="common-box-right"> <input name="reg" type="text" class="text-box" value="Rs. '.((round($a+ $calculatedtax + $r))) .'" readonly=""/> </div> </div> '; die($list); }
额外说明
- 如果两段代码位于不同文件中,需要将封装的
calculateBasicPremium函数放在公共文件中,在两个文件顶部通过require或include引入公共文件。 - 后续若需调整
$r的计算逻辑,只需修改这一个函数即可,无需改动多处代码,提升维护效率。
内容的提问来源于stack exchange,提问作者Ruchika
相关产品推荐
相关产品推荐

