php 7.1 无字符串隐藏内置功能,需自行实现脱敏;其新增的私有类常量可用于封装脱敏规则,提升安全性;推荐用 mb_substr + str_repeat 实现 utf-8 兼容脱敏。

PHP 7.1 本身**没有新增字符串隐藏的内置函数或语法特性**,所谓“PHP7.1字符串隐藏功能”是一种常见误解。字符串隐藏(如姓名、手机号脱敏)属于业务逻辑需求,需开发者自行实现,与 PHP 版本无关。但 PHP 7.1 引入的**类常量可见性(public/protected/private)**,可用来封装脱敏规则,提升代码安全性与可维护性——这才是它对“隐藏”场景的真正价值。
用 mb_substr + str_repeat 做基础脱敏(兼容 PHP 7.1+)
这是最常用、最稳妥的方式,适用于中文姓名、手机号等 UTF-8 字符串:
- 用
mb_substr($str, 0, 1, 'UTF-8')取首字符(避免乱码) - 用
mb_strlen($str, 'UTF-8') - 1算出需隐藏的字数 - 用
str_repeat('*', $count)生成星号串,再拼接
示例(隐藏姓名,只留姓):
php$name = "欧阳修";
$masked = mb_substr($name, 0, 1, 'UTF-8') . str_repeat('*', mb_strlen($name, 'UTF-8') - 1);
echo $masked; // 输出:欧**
?>
封装成可复用的方法(推荐用 PHP 7.1+ 的私有常量管理规则)
利用 PHP 7.1 支持的 private const,把脱敏策略参数集中定义,防止硬编码散落:
private const NAME_KEEP_FIRST = 1;
private const PHONE_KEEP_HEAD_TAIL = [3, 4]; // 前3位+后4位可见
private const DEFAULT_MASK_CHAR = '*';
public static function name(string $name): string {
$len = mb_strlen($name, 'UTF-8');
if ($len return mb_substr($name, 0, self::NAME_KEEP_FIRST, 'UTF-8')
. str_repeat(self::DEFAULT_MASK_CHAR, $len - self::NAME_KEEP_FIRST);
}
}
echo Masker::name("司马相如"); // 司*****
?>
处理手机号、邮箱等结构化字段
不建议手动计算下标,应按语义切分:
-
手机号:保留前3位和后4位,中间用
*替换(共11位) -
邮箱:用
@分割,用户名部分保留首尾字符,域名通常全显或按需隐藏
示例(邮箱脱敏):
$email = "zhang.san@example.com";if (strpos($email, '@') !== false) {
list($user, $domain) = explode('@', $email, 2);
$maskedUser = mb_substr($user, 0, 1) . str_repeat('*', max(0, mb_strlen($user) - 2))
. mb_substr($user, -1);
echo $maskedUser . '@' . $domain; // z***n@example.com
}
?>
注意:别混淆“隐藏字符串内容”和“隐藏 PHP 技术栈”
有人搜索“PHP 隐藏”会误入服务器配置层面,比如:
-
expose_php = Off(在 php.ini 中关闭 PHP 版本暴露) - 用 Apache/Nginx 配置把
.php扩展名伪装成.html或自定义后缀
这类操作是隐藏服务端技术细节,和业务层的字符串脱敏完全无关,不要混用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











