PHP逻辑运算符与短路求值
逻辑运算符的短路求值特性在某些场景下很有用。今天说说PHP中逻辑运算符的使用和短路求值的应用。
基本逻辑运算符。
```php
$a = true;
$b = false;
var_dump($a && $b); // false
var_dump($a || $b); // true
var_dump(!$a); // false
var_dump($a and $b); // false
var_dump($a or $b); // true
var_dump($a xor $b); // true
?>
短路求值。
```php
function first(): bool
{
echo "first()被调用\n";
return false;
}
function second(): bool
{
echo "second()被调用\n";
return true;
}
// && 短路:第一个为false,第二个不会执行
$result = first() && second();
echo "结果: " . ($result ? 'true' : 'false') . "\n\n";
// || 短路:第一个为true,第二个不会执行
function third(): bool
{
echo "third()被调用\n";
return true;
}
function fourth(): bool
{
echo "fourth()被调用\n";
return false;
}
$result2 = third() || fourth();
echo "结果: " . ($result2 ? 'true' : 'false') . "\n";
?>
短路求值的实用场景。
```php
// 安全调用
$user = getUser();
if ($user !== null && $user->isActive()) {
echo "用户活跃\n";
}
// 使用 && 代替 if
$user !== null && $user->isActive() && sendEmail($user);
// 默认值
$name = $input['name'] || '默认名';
$config = $userConfig || $defaultConfig;
// 早期返回
function processOrder(?array $order): void
{
$order !== null || throw new InvalidArgumentException("订单不存在");
$order['status'] === 'pending' || throw new RuntimeException("订单状态不对");
// 处理...
}
?>
逻辑运算符和赋值组合。
```php
// ??= 空合并赋值
$name ??= '默认名';
// &&= 逻辑与赋值
$user->isAdmin &&= $user->isActive();
// ||= 逻辑或赋值
$cache ||= loadFromDatabase();
// ?= 三元运算符简化
$result = $condition ? $value1 : $value2;
?>
多个条件的顺序。
```php
function complexCheck(array $data): bool
{
// 把开销小的条件放前面,利用短路减少计算
return count($data) > 0
&& $data['status'] === 'active'
&& $this->expensiveCheck($data);
}
?>
and/or的优先级低于赋值。
```php
$result = true and false; // 相当于 ($result = true) and false
var_dump($result); // true
$result2 = true && false;
var_dump($result2); // false
// 建议用&&和||代替and/or,避免优先级问题
?>
短路求值可以提高效率。利用短路特性可以避免不必要的函数调用。将其用在安全调用防止空指针。and/or的优先级与&&/||不同,注意区分。合理使用短路求值让代码更简洁高效。
PHP逻辑运算符与短路求值
张小明
前端开发工程师
从《半日》到代码人生:一个程序员如何用技术思维解读“时间感知”与“环境剧变”
从《半日》到代码人生:技术思维下的时间感知与环境适应1. 当文学隐喻遇上技术迭代纳吉布马哈福兹在《半日》中描绘了一个男孩在半天内经历从入学到暮年的超现实体验。这种时间压缩的震撼感,与程序员打开三年前自己写的代码时的感受惊人相似——那些曾经熟…
FPGA IO设计实战:Cyclone II引脚配置、高速接口与信号完整性解析
1. 项目概述:深入理解Cyclone II的IO资源作为一名在数字电路设计领域摸爬滚打了十多年的工程师,我深知FPGA项目成败的关键,往往不在于内部逻辑设计得多么精妙,而在于与外部世界“握手”的接口——也就是IO(Input/Outpu…
从欧司朗Ostar LED看大功率照明技术演进与工程挑战
1. 项目背景与行业意义2007年初,当我在翻阅一份行业期刊时,一条来自欧司朗的简短新闻引起了我的注意。它宣称推出了一款光通量超过1000流明的LED,亮度足以超越当时主流的50瓦卤素灯。这在今天看来或许稀松平常,但在当时࿰…
别再傻傻加载全图了!GeoServer WMS服务用cql_filter实现前端动态筛选(OpenLayers实战)
高效地图渲染实战:GeoServer WMS动态过滤与OpenLayers性能优化在WebGIS开发中,地图加载速度直接影响用户体验。当面对海量地理数据时,传统全量加载方式不仅浪费带宽,还会导致页面卡顿甚至崩溃。本文将深入探讨如何利用GeoServer的…
别再只会搜IP了!FOFA高级搜索语法实战:从资产发现到漏洞预警的完整工作流
从资产测绘到威胁狩猎:FOFA高阶语法构建企业级安全监控体系在数字化浪潮席卷各行各业的今天,企业资产暴露面呈现爆炸式增长。传统的安全防护往往被动应对漏洞和攻击,而真正的安全专家需要主动发现风险、预判威胁。作为网络空间测绘领域的标杆…
恶意软件家族深度解析:从病毒、木马到蠕虫的工程化查杀实战
1. 恶意软件家族:从概念到实战的深度拆解在数字世界里,我们工程师每天打交道的不只是代码、电路和协议,还有一群看不见的“访客”——恶意软件。无论是调试嵌入式设备的固件,还是分析智能手机应用的网络行为,亦或是维护…