共计 3268 个字符,预计需要花费 9 分钟才能阅读完成。
对于 PHP 这样一个 web 语言来说,接参是十分重要的一个能力。毕竟从前端表单或异步申请传递上来的数据都要获取到能力进行失常的交互展现。当然,这也是所有可能进行 web 开发的语言的必备能力。明天咱们就来看看 PHP 各种各样的接参模式。
首先,咱们要筹备一个动态页面,就像上面这个一样,它提供了一个表单,同时 url 里还带有一个 GET 参数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="?show=1" method="post">
姓名:<input type="text" name="name"/><br />
电话:<input type="text" name="tel"/><br/>
地址(省):<input type="text" name="address.prov"/><br/>
地址(市):<input type="text" name="address city"/><br/>
趣味 1:<input type="text" name="interest[]"/><br/>
趣味 2:<input type="text" name="interest[]"/><br/>
趣味 3:<input type="text" name="interest[]"/><br/>
学历 1:<input type="text" name="edu[one]"/><br/>
学历 2:<input type="text" name="edu[two]"/><br/>
<input type="submit" value="提交" >
</form>
</body>
</html>
失常的 $_GET、$_POST 形式
// 失常的 GET、POST
echo $_GET['show'], '<br/>'; // 1
echo $_POST['name'], '<br/>'; // 提交的内容
这是最根底的也是最间接的接参形式,GET 参数通过 $_GET 获取,POST 参数通过 $_POST 获取,相互都不烦扰。
失常的 $_REQUEST 形式
// 应用 REQUEST
echo $_REQUEST['show'], '<br/>'; // 1
echo $_REQUEST['tel'], '<br/>'; // 提交的内容
$_REQUEST 则是获取所有申请中的参数,不包含上传文件。也就是说,它蕴含了 $_GET、$_POST 以及 $_COOKIE(须要配置,默认不蕴含) 这三个接参变量中的所有内容。这里须要留神的一点是,PHP5.3 当前,$_REQUEST 承受的参数变量内容由 php.ini 文件中的 request_order 指定,默认状况下这个配置参数的值是 GP 也就是 GET 和 POST,并没有 COOKIE,想要 COOKIE 的话须要批改这里增加一个 C 就能够了。
如果 $_GET、$_POST 中有同名的内容呢?$_REQUEST 展现的程序也是依据这配置参数的程序来的,从左至右,前面的笼罩后面的,比方你配置的是 GP 那么参数笼罩的程序是:POST > GET,最终显示的就是 POST 中的内容。
register_globals 问题
// register_globals 如果关上
echo $name, '<br/>'; // 提交的内容
echo $tel, '<br/>'; // 提交的内容
这是一个不平安的配置,也是在 php.ini 文件中进行配置的。它的作用就是将申请来的参数间接转成变量,有全局变量净化的问题,不要关上!!!当初的 php.ini 文件中根本都是默认敞开的。
import_request_variables
// import_request_variables 道歉,5.4 之后曾经勾销了
import_request_variables('pg', 'pg_');
echo $pg_show, '<br/>';
echo $pg_name, '<br/>';
这个函数是手动将指定的参数变量外面的内容注册为全局变量,同样的,它也在 5.4 之后被勾销的,这样的函数都会存在危险,咱们理解一下已经有过这样一个函数即可。
extract
extract($_POST, EXTR_PREFIX_ALL, 'ex');
echo $ex_name, '<br/>'; // 提交的内容
echo $ex_tel, '<br/>'; // 提交的内容
extract 是目前能够代替下面两种参数转变量的形式中目前仍然反对的。它是由咱们本人来管制对已存在变量的笼罩的,也就是第二个参数,这样在可控的环境下能够极大地防止净化全局变量的问题,当然前提还是咱们本人要确定应用它,具体内容能够自行查找文档参考哦!
参数名中的. 和空格
// 参数名中的. 和空格
echo $_REQUEST['address_prov'], '<br/>'; // 提交的内容
echo $_REQUEST['address_city'], '<br/>'; // 提交的内容
表单提交的 input 的 name 中如果蕴含 . 或者 空格,将间接转换成 下划线。不过咱们在前端命名中也不倡议应用 . 或者 空格,须要的时候间接就应用 下划线 就好了,前后端不要造成歧义。
参数名中的 []
// 参数名中的 []
print_r($_REQUEST['interest']); // Array (v,....)
echo '<br />';
print_r($_REQUEST['edu']); // Array (k/v,....)
当表单提交的 input 的 name 是数组模式的,也就是 “interest[]” 或 “edu[one]” 这种模式时,咱们接管到的参数默认就会成为一个数组模式的内容。
高大上的 php://input
// php://input
$content = file_get_contents('php://input');
print_r($content); //name=xxx&.....
最初就是当初接口开发中常常会应用的 php://input 模式接参。个别是因为平安或参数字段较多的状况下,前端通过 Body Raw 的模式间接传递一整段的 Body 内容过去。这时候就只能用这种模式获取到了,这个 Body Raw 的原始内容个别会是一整段的文字,也有可能是进行过一些加密解决的内容,格局能够本人定义。而面对一般表单,咱们将会接管到的也是原始的表单内容,就像下面的 name=xxx&tel=xxx&…. 这样的内容。
须要留神的是 enctype=”multipart/form-data” 时它是无奈获取到内容的。同时,这种形式也是代替 $HTTP_RAW_POST_DATA 全局变量的,不要再应用淘汰的能力了哦,尽早更新新版本的 PHP 应用新的语法个性哦!
总结
轻易一整顿就发现原来简简单单的一个接参就有这么多种形式和须要留神的中央,还真是大开眼界。仍然是那句话,学无止尽,持续深刻的钻研早晚你也会成为大牛!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E5%8F%98%E7%9D%80%E8%8A%B1%E6%A0%B7%E6%9D%A5%E6%8E%A5%E5%8F%82%EF%BC%8CPHP%E4%B8%AD%E6%8E%A5%E6%94%B6%E5%A4%96%E9%83%A8%E5%8F%82%E6%95%B0%E7%9A%84%E6%96%B9%E5%BC%8F.php
参考文档:
https://www.php.net/manual/zh/language.variables.external.php
https://www.php.net/manual/zh/function.import-request-variables.php
https://www.php.net/manual/zh/function.extract.php
各自媒体平台均可搜寻【硬核项目经理】