最可靠的方式是用 json_encode() 把 php 变量转成合法 js 字面量再注入 script 标签,它能自动处理 null、数组、中文、换行、单双引号等所有边界情况,避免语法错误和 xss 漏洞。

最可靠的方式是用 json_encode() 把 PHP 变量转成合法 JS 字面量,再注入 <script></script> 标签里。它能自动处理 null、数组、中文、换行、单双引号等所有边界情况,避免语法错误和 XSS 漏洞。
必须用 json_encode(),不能直接 echo
直接输出 PHP 变量到 JS 中极容易翻车:
- `$id = null` → `let id = ;` 会报语法错误
- `$name = "O'Reilly"` → `let name = 'O'Reilly';` 提前闭合字符串
- `$data = ['a', 'b']` → `{!! $data !!}` 输出 `Array`,JS 解析失败
这些都不是“少加个引号”的问题,而是类型和语法层面的断裂。`json_encode()` 是唯一能保证 PHP 值→JS 值一对一映射的方法。
正确写法:带标志、不套引号、放 script 内部
推荐写法(通用 PHP 环境):<script>const user = <?php echo json_encode($user, JSON_UNESCAPED_UNICODE); ?>;</script>
关键点:
- 不要给 json_encode() 的输出再加外层引号(如 "<?php ... ?>"),否则 JS 会当成字符串而非对象
- 必须加 JSON_UNESCAPED_UNICODE,否则中文变 \u4f60,影响可读性和调试
- 生产环境建议补上 JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT 防绕过
Laravel 和 Yii2 的写法差异
Laravel Blade 中:<script>const config = {!! json_encode($config) !!};</script>
注意必须用 {!! !!}(非转义输出),且 json_encode() 要包在里面,不是包变量本身。
Yii2 中推荐用框架方法:<?php use yii\helpers\Json; $this->registerJs('const restaurantID = ' . Json::encode($restaurant->id) . ';', \yii\web\View::POS_END); ?>
它底层也是调用 json_encode(),但自动处理上下文和执行时机,更安全。
其他可用但需谨慎的方式
这些方式可以作为补充,但不如 `json_encode()` + `<script>` 直接可靠:<br> - <strong>data-* 属性:适合简单值,如 <code><div data-id="<?php echo json_encode($id); ?>">,JS 里用 <code>JSON.parse(el.dataset.id)<br> - <strong>AJAX 请求:适合动态、敏感或大体积数据,PHP 单独接口返回 <code>header('Content-Type: application/json') + <code>echo json_encode(...)<br> - <strong>隐藏 input:仅限字符串或数字标量,且要防篡改,不推荐用于逻辑关键值</script>
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











