
本文介绍如何高效判断 PHP 会话变量(如 $_SESSION['access'])中是否包含指定子字符串,涵盖 PHP 8+ 的 str_contains() 函数及兼容旧版本的 strstr() 替代方案,并说明使用注意事项。
本文介绍如何高效判断 php 会话变量(如 `$_session['access']`)中是否包含指定子字符串,涵盖 php 8+ 的 `str_contains()` 函数及兼容旧版本的 `strstr()` 替代方案,并说明使用注意事项。
在 Web 开发中,常需基于用户会话中的权限标识(如逗号分隔的字符串 dummy1,dummy2,dummy3)动态控制功能可见性或访问逻辑。此时,判断该字符串是否“包含”某个关键词(例如 "dummy1"),是典型的字符串匹配需求。
PHP 并不支持面向对象式的链式调用(如 .contains()),但提供了原生函数实现等效逻辑:
✅ 推荐方式(PHP ≥ 8.0):使用 str_contains()
该函数专为“子串存在性判断”设计,语义清晰、返回布尔值,且性能优化良好:
if (str_contains($_SESSION['access'] ?? '', 'dummy1')) {
echo "用户拥有 dummy1 权限";
}
⚠️ 注意:务必使用空合并运算符 ?? '' 防止 $_SESSION['access'] 未定义时触发 Notice 错误。
✅ 兼容方案(PHP
strstr() 返回首次匹配子串起始位置后的剩余字符串(含匹配部分),若未找到则返回 false。因此可直接用于条件判断:
if (strstr($_SESSION['access'] ?? '', 'dummy1') !== false) {
echo "用户拥有 dummy1 权限";
}
? 提示:必须显式与 false 比较(使用 !==),避免 "0" 等假值误判(例如当 'dummy1' 出现在字符串开头时,strstr() 返回完整字符串,其布尔值为 true;但若忽略严格比较,可能因类型转换导致逻辑错误)。
❌ 不推荐方式:strpos() + !== false
虽可行,但易错(常见疏漏是写成 != false 而非 !== false),且语义不如 str_contains() 直观:
// 不推荐(易出错)
if (strpos($_SESSION['access'] ?? '', 'dummy1') !== false) { ... }
// 更安全但冗余 —— 优先选 str_contains()
? 重要提醒
- 若 $_SESSION['access'] 存储的是结构化权限(如 JSON 数组或序列化数据),建议改用 json_decode() 或 unserialize() 后进行数组搜索(如 in_array()),避免字符串匹配带来的歧义(例如 "dummy12" 会被 "dummy1" 错误匹配)。
- 实际生产环境中,权限校验应结合服务端逻辑与数据库验证,不可仅依赖客户端可控的会话变量。
综上,str_contains() 是现代 PHP 中最简洁可靠的“包含判断”方案;对于旧环境,strstr() 是安全、广泛支持的替代选择——关键在于始终处理未定义变量,并采用严格比较。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











