1

有人可以向我解释为什么我在第二个代码片段中得到变量 $subtotal 的“通知:未定义变量”,但在第一个代码片段中没有?他们之间有什么区别?他们是否考虑局部变量?

另外,foreach 循环中 $cartKey 和 $cartItem 的变量类型(全局、超全局..等)到底是什么?为什么我不需要定义/声明它们?

switch( $_SESSION['shippingMethod'] )
{
  case "Air": 
             $shipping = $subtotal * 0.1;
             break;
}

foreach( $cart as $cartKey => $cartItem )
{
    $subtotal += $cartItem['total'];
}

非常感谢您的帮助。

4

2 回答 2

7

基本上,错误是说您$subtotal在设置之前使用变量,或者在您的情况下,您在设置之前增加了一个值:

$subtotal=0;
foreach( $cart as $cartKey => $cartItem )
{
    $subtotal += $cartItem['total'];
}

编辑:如果$subtotal设置可能是由于其他代码设置或未设置,则应进行检查,或者您应该在脚本开始时设置它:

$subtotal=(isset($subtotal))?$subtotal:0;
foreach( $cart as $cartKey => $cartItem )
{
    $subtotal += $cartItem['total'];
}

error_reporting(E_ALL)在开发任何脚本时,必须将代码中的每个错误都提供给您总是一个好主意,从长远来看,它可以帮助您学习。一旦你看到一些通知未定义的消息,你就会改变你编码和检查变量的方式。然后当脚本准备好发布时E_ALL转向0

于 2012-04-25T17:46:31.337 回答
3

显然$subtotal在循环所在的区域还不存在。由于您正在使用+=,因此您会收到此错误,因为您实际上是在说:

$subtotal = $subtotal + $cartItem['total']

在这种情况下$cartKey$cartItem确实定义了它们......它们是您从数组项的当前键和值创建它们的循环结构的一部分 - 将它们从数组“复制”到当前范围。例如。通过这样做$cartKey => $cartItem,您定义了这些变量。

于 2012-04-25T17:49:34.670 回答