PHP中base64_encode处理双引号内拼接变量字符串的原理咨询
PHP双引号变量拼接传入base64_encode生效的原理
这是PHP最基础的双引号字符串解析规则导致的,逻辑非常直接:
- PHP对双引号包裹的字符串有特殊解析逻辑:执行时会自动扫描字符串内的内容,识别到合法的
$开头的变量名时,会直接把变量的实际值替换到对应位置,整个替换过程在字符串作为参数传入函数之前就已经完成了。
你的代码里"$user:$pass"在传入base64_encode之前,就已经被解析成了字面量字符串username:password,和你用点运算符手动写$user . ':' . $pass得到的结果没有任何区别。 base64_encode接收到的参数本身就是已经拼接完成的、符合HTTP Basic认证要求的用户名:密码格式明文,编码结果自然是正确的,请求能正常通过认证也就不奇怪了。
补充提醒:单引号包裹的字符串不会触发变量解析,如果你把代码改成
base64_encode('$user:$pass'),函数接收到的就是字面量文本$user:$pass,编码结果不符合预期,就会出现认证失败的问题。
你可以把代码拆成更直观的等价写法验证,以下几种写法运行结果完全一致:
$user = "username"; $pass = "password"; // 写法1:双引号内直接写变量(你的原有写法) $auth1 = base64_encode("$user:$pass"); // 写法2:用点运算符手动拼接 $plain = $user . ':' . $pass; $auth2 = base64_encode($plain); // 写法3:格式化拼接 $auth3 = base64_encode(sprintf("%s:%s", $user, $pass));
三种写法最终得到的Base64编码值完全相同,不存在任何效果差异。
内容的提问来源于stack exchange,提问作者Georgio
相关产品推荐
相关产品推荐

