PHP 运算符
PHP 提供了多种运算符来执行数学计算和高效地更新变量的值。这些运算符是脚本中处理数字数据的基础。
1. 算术运算符
算术运算符用于执行标准的数学运算,如加、减、乘、除和取模(求余)。PHP 支持以下算术运算符:
| 运算符 | 名称 | 示例 | 结果(假设 $a = 10, $b = 3) |
|---|---|---|---|
+ | 加法 | $a + $b | 13 |
- | 减法 | $a - $b | 7 |
* | 乘法 | $a * $b | 30 |
/ | 除法 | $a / $b | 3.333... |
% | 取模(求余) | $a % $b | 1 |
** | 指数(乘方) | $a ** $b | 1000 |
1.1 加法运算符 (+)
加法运算符将两个操作数相加。它可以用于整数和浮点数。
<?php
$num1 = 15;
$num2 = 7;
$sum = $num1 + $num2; // $sum 的值将是 22
echo "总和:" . $sum . "\n";
$price1 = 19.99;
$price2 = 5.50;
$totalPrice = $price1 + $price2; // $totalPrice 的值将是 25.49
echo "总价:" . $totalPrice . "\n";
?>1.2 减法运算符 (-)
减法运算符计算两个操作数之间的差值。
<?php
$stockA = 100;
$soldA = 35;
$remainingA = $stockA - $soldA; // $remainingA 的值将是 65
echo "剩余库存:" . $remainingA . "\n";
$temperatureNow = 28.5;
$temperatureYesterday = 32.1;
$temperatureChange = $temperatureNow - $temperatureYesterday; // $temperatureChange 的值将是 -3.6
echo "温度变化:" . $temperatureChange . "\n";
?>1.3 乘法运算符 (*)
乘法运算符计算两个操作数的乘积。
<?php
$quantity = 12;
$unitPrice = 2.50;
$itemCost = $quantity * $unitPrice; // $itemCost 的值将是 30
echo "物品成本:" . $itemCost . "\n";
$width = 7.5;
$height = 4.0;
$area = $width * $height; // $area 的值将是 30
echo "面积:" . $area . "\n";
?>1.4 除法运算符 (/)
除法运算符用第一个操作数除以第二个操作数。在 PHP 中,除以零会导致产生 PHP Warning(警告),并根据操作数的不同返回 INF(无穷大)或 NAN(非数字)。
<?php
$totalStudents = 40;
$groups = 8;
$studentsPerGroup = $totalStudents / $groups; // $studentsPerGroup 的值将是 5
echo "每组学生人数:" . $studentsPerGroup . "\n";
$distance = 150.0;
$time = 2.5;
$speed = $distance / $time; // $speed 的值将是 60.0
echo "速度:" . $speed . "\n";
// 除以零的示例(会导致警告并输出 INF)
// $result = 10 / 0;
// echo "除以零:" . $result . "\n";
?>1.5 取模运算符 (%)
取模运算符返回除法运算的余数。这对于判断一个数是奇数还是偶数,或者处理循环周期性任务非常有用。
<?php
$totalItems = 25;
$itemsPerPage = 6;
$remainingItems = $totalItems % $itemsPerPage; // $remainingItems 的值将是 1(25 / 6 = 4,余数为 1)
echo "剩余物品:" . $remainingItems . "\n";
$number = 17;
$isEven = ($number % 2 == 0); // $isEven 的值将是 false(17 % 2 = 1)
echo "17 是偶数吗?" . ($isEven ? "是" : "否") . "\n";
$year = 2024;
// 闰年的规则是能被 4 整除,但不能被 100 整除(除非能被 400 整除)。
// 为了简单起见,这里我们只检查能否被 4 整除。
$isLeapYearRoughly = ($year % 4 == 0); // $isLeapYearRoughly 的值将是 true(2024 % 4 = 0)
echo "2024 年大致是闰年吗?" . ($isLeapYearRoughly ? "是" : "否") . "\n";
?>1.6 指数运算符 (**)
指数运算符将第一个操作数作为底数,第二个操作数作为指数进行乘方运算。
<?php
$base = 2;
$power = 3;
$result = $base ** $power; // $result 的值将是 8 (2 * 2 * 2)
echo "2 的 3 次方:" . $result . "\n";
$radius = 5;
$areaCircle = M_PI * ($radius ** 2); // 计算圆的面积 (PI * r^2)
echo "半径为 5 的圆的面积:" . $areaCircle . "\n";
?>在上面的示例中,M_PI 是 PHP 内部提供的一个内置常量,代表圆周率 Pi 的值。
2. 赋值运算符
赋值运算符用于给变量分配值。最基础的赋值运算符是 =,它将右侧操作数的值赋给左侧的操作数。PHP 还提供了“复合”赋值运算符,它们可以在单个步骤中执行算术运算并将结果重新赋给该变量。
| 运算符 | 示例 | 等同于 |
|---|---|---|
= | $a = $b | $a = $b |
+= | $a += $b | $a = $a + $b |
-= | $a -= $b | $a = $a - $b |
*= | $a *= $b | $a = $a * $b |
/= | $a /= $b | $a = $a / $b |
%= | $a %= $b | $a = $a % $b |
**= | $a **= $b | $a = $a ** $b |
2.1 简单赋值运算符 (=)
该运算符将其右侧的值分配给左侧的变量。
<?php
$score = 100; // 将整数 100 赋值给 $score
echo "分数:" . $score . "\n";
$username = "john_doe"; // 将字符串 "john_doe" 赋值给 $username
echo "用户名:" . $username . "\n";
?>2.2 加法赋值运算符 (+=)
将右操作数加到左操作数上,并将结果赋给左操作数。
<?php
$currentValue = 50;
$currentValue += 10; // 等同于 $currentValue = $currentValue + 10; $currentValue 现在是 60
echo "执行 += 10 后:" . $currentValue . "\n";
$balance = 1000.00;
$deposit = 250.75;
$balance += $deposit; // $balance 现在是 1250.75
echo "存款后的新余额:" . $balance . "\n";
?>2.3 减法赋值运算符 (-=)
从左操作数中减去右操作数,并将结果赋给左操作数。
<?php
$stock = 200;
$sold = 75;
$stock -= $sold; // 等同于 $stock = $stock - $sold; $stock 现在是 125
echo "剩余库存:" . $stock . "\n";
$debt = 500.00;
$payment = 150.00;
$debt -= $payment; // $debt 现在是 350.00
echo "剩余债务:" . $debt . "\n";
?>2.4 乘法赋值运算符 (*=)
将左操作数乘以右操作数,并将结果赋给左操作数。
<?php
$quantity = 5;
$quantity *= 3; // 等同于 $quantity = $quantity * 3; $quantity 现在是 15
echo "执行 *= 3 后的数量:" . $quantity . "\n";
$price = 10.50;
$taxRate = 1.08; // 8% 的税
$price *= $taxRate; // $price 现在是 11.34 (10.50 * 1.08)
echo "含税价格:" . $price . "\n";
?>2.5 除法赋值运算符 (/=)
将左操作数除以右操作数,并将结果赋给左操作数。
<?php
$totalScore = 1000;
$totalScore /= 5; // 等同于 $totalScore = $totalScore / 5; $totalScore 现在是 200
echo "平均分:" . $totalScore . "\n";
$value = 99.9;
$divisor = 3.3;
$value /= $divisor; // $value 现在是 30.27...
echo "执行 /= 3.3 后的值:" . $value . "\n";
?>2.6 取模赋值运算符 (%=)
计算左操作数除以右操作数的余数,并将结果赋给左操作数。
<?php
$counter = 17;
$counter %= 5; // 等同于 $counter = $counter % 5; $counter 现在是 2 (17 / 5 = 3,余数为 2)
echo "执行 %= 5 后的计数器:" . $counter . "\n";
$dayOfWeek = 8; // 假设 0 = 星期日,1 = 星期一,...,6 = 星期六
$dayOfWeek %= 7; // $dayOfWeek 现在是 1 (8 % 7 = 1),也就是星期一
echo "当前是一周的第几天 (0-6):" . $dayOfWeek . "\n";
?>2.7 指数赋值运算符 (**=)
将左操作数进行右操作数指定的乘方运算,并将结果赋给左操作数。
<?php
$num = 2;
$num **= 4; // 等同于 $num = $num ** 4; $num 现在是 16 (2 * 2 * 2 * 2)
echo "执行 **= 4 后的 Num:" . $num . "\n";
$baseValue = 3;
$exponent = 2;
$baseValue **= $exponent; // $baseValue 现在是 9 (3 * 3)
echo "乘方运算后的底数值:" . $baseValue . "\n";
?>复合赋值运算符提供了一种简洁的更新变量的方式,能有效提高代码的可读性和编写效率。
3. 运算符优先级与结合性
当一个表达式中包含多个运算符时,PHP 会遵循 优先级(Precedence)和结合性(Associativity) 的规则来决定计算的顺序。
- 优先级: 具有较高优先级的运算符会在较低优先级的运算符之前被计算。例如,乘法 (
*) 和除法 (/) 的优先级高于加法 (+) 和减法 (-)。因此,在5 + 3 * 2中,乘法会先执行(3 * 2 = 6),然后再执行加法(5 + 6 = 11)。 - 结合性: 当运算符具有相同的优先级时,结合性决定了计算顺序。大多数算术运算符是左结合的,这意味着它们从左到右依次计算。例如,
10 / 2 * 5的计算过程是(10 / 2) * 5,即5 * 5 = 25。而指数运算符 (**) 是右结合的(2 ** 3 ** 2等同于2 ** (3 ** 2),即2 ** 9 = 512)。
你可以使用圆括号 () 来显式控制计算顺序,从而覆盖默认的优先级。括号内的表达式始终会被优先计算。
<?php
$result1 = 5 + 3 * 2; // 先乘法:5 + 6 = 11
echo "结果 1:" . $result1 . "\n";
$result2 = (5 + 3) * 2; // 括号优先:8 * 2 = 16
echo "结果 2:" . $result2 . "\n";
$result3 = 10 / 2 * 5; // 左结合性:(10 / 2) * 5 = 5 * 5 = 25
echo "结果 3:" . $result3 . "\n";
$result4 = 2 ** 3 ** 2; // 右结合性:2 ** (3 ** 2) = 2 ** 9 = 512
echo "结果 4:" . $result4 . "\n";
?>理解优先级对于避免意想不到的计算结果至关重要。如果有任何疑虑,加上括号以确保按照你期望的顺序执行永远是最保险的做法。
4. 综合实战案例
4.1 计算折扣与最终价格
想象你正在开发一个电子商务应用。你需要计算商品打折后的价格,以及包含税费的最终结算价格。
<?php
$originalPrice = 120.00; // 商品原价
$discountRate = 0.15; // 15% 的折扣
$taxRate = 0.08; // 8% 的销售税
// 计算折扣金额
$discountAmount = $originalPrice * $discountRate;
// 计算折后价格
$priceAfterDiscount = $originalPrice - $discountAmount;
echo "享受 " . ($discountRate * 100) . "% 折扣后的价格:$" . number_format($priceAfterDiscount, 2) . "\n";
// 根据折后价格计算税费金额
$taxAmount = $priceAfterDiscount * $taxRate;
// 计算包含税费的最终价格
$finalPrice = $priceAfterDiscount + $taxAmount;
echo "包含 " . ($taxRate * 100) . "% 税费的最终价格:$" . number_format($finalPrice, 2) . "\n";
// 使用复合赋值运算符使计算更加简洁:
echo "\n--- 使用复合赋值运算符 ---\n";
$itemPrice = 120.00;
$itemPrice -= ($itemPrice * 0.15); // 应用 15% 的折扣
echo "享受 15% 折扣后的价格:$" . number_format($itemPrice, 2) . "\n";
$itemPrice *= (1 + 0.08); // 增加 8% 的税费 (乘以 1.08)
echo "包含 8% 税费的最终价格:$" . number_format($itemPrice, 2) . "\n";
?>4.2 跟踪库存水平
对于库存管理系统,你经常需要动态更新商品的库存计数。
<?php
$currentStock = 500; // 初始库存数量
echo "初始库存:" . $currentStock . "\n";
$itemsSoldToday = 120;
$currentStock -= $itemsSoldToday; // 减去今天售出的物品
echo "今天销售后的库存:" . $currentStock . "\n";
$itemsReceivedShipment = 250;
$currentStock += $itemsReceivedShipment; // 加上收到的新进货
echo "收到进货后的库存:" . $currentStock . "\n";
$damagedItems = 15;
$currentStock -= $damagedItems; // 减去损坏的物品
echo "扣除损坏物品后的库存:" . $currentStock . "\n";
// 发生了一笔大宗订单,数量为当前库存的 10%。
$bulkOrderQuantity = $currentStock * 0.10;
// 我们不能出售零点几个商品,所以通常需要向下取整。
// 在这个例子中,为了简单起见,我们假设只要适用就进行整数操作。
$currentStock -= floor($bulkOrderQuantity); // 卖出大约 10%
echo "处理大宗订单(约 10%)后的库存:" . $currentStock . "\n";
?>