批改状态:合格
老师批语:
以url中的查询字符串http://localhost/user?id=1为例,其中id=1就叫查询字符串,此时打印id的值:
$id = $_GET['id'];var_dump($id); // string(1) "1"
结果发现$id的值为“1”,是一个字符串,如果此时我们判断$id的值是否为1,
if ($id === 1) {echo "找到了该用户!";} else {echo "未找到该用户!";}
以上结果会输出:未找到该用户!,这是因为我们的$id的值是一个字符串,而与之比较的值是一个整型数值1,因此我们要对变量$id进行转换:
if ((int)$id === 1) {echo "找到了该用户!";} else {echo "未找到该用户!";}
此时,变量$id的类型就转换成整型数值了。
相关的类型转换如下:
注意:临时转换并不会改变变量的原始类型。
每一个数据多有它的类型,只有相同类型的数据才能彼此操作。在PHP中,自动转换通常发生在不同数据类型之间的运算。若参与的运算变量的类型不通,则先转换为同一类型,然后再进行运算。
以下是PHP自动类型转换的例子,是使用“+”进行运算的。如果任意一个运算数是浮点数,则所有的运算数都被当成浮点数,结果也是一个浮点数。
$foo = "100abc"; // 声明一个字符串变量$foo$foo += 2; // $foo现在是一个整型,值为102$foo += 1.3; // $foo现在是一个float型,值为103.3$foo = null + "10 abc def"; // $foo是一个整型,值为10$foo = null + "10.3 abc def"; // $foo是float型,值为10.3
永久类型转换只针对变量。
通常,我们使用(string) $value的类型转换并不会改变原始的$value的类型,而通过settype()可以改变原始变量的类型:
$price = 1499; // int类型// 使用settype()改变数据的原始类型var_dump(settype($price)); // 此时$price的类型就是string了。
从之前的学习中,我们可以使用var_dump()函数来查看某个表达式的值和类型,但是我们还可以通过PHP提供的一些特定函数测试每个变量的类型。
变量类型检测函数使用方法案例:
$bool = TRUE; // 定义一个布尔型变量$str = "foo"; // 定义一个字符串类型变量$int = 100; // 定义一个整型变量
使用gettype()函数输出$bool的变量类型:boolean。
echo gettype($bool);
使用var_dump()函数直接输出变量$str的类型和值。
var_dump($str);
通过is_int()函数判断$int是否为整型变量,此时会输出$int is 104。
if (is_int($int)) {$int += 4;echo '$int is ' . $int;}
通过is_string()函数判断当前变量是否为字符串类型,此时会输出else里面的内容:$bool is not a string,因为$bool并不是一个字符串类型的变量。
if (is_string($bool)) {echo '$bool is a string valued:' . $bool;} else {echo '$bool is not a string';}
通过is_bool()函数判断当前变量是否为布尔值类型,此时会输出$bool is boolean: 1。
if (is_bool($bool)) {echo '$bool is boolean: ' . $bool;}
总结,常用的数据类型检测如下:
变量与常量都是PHP存储数据的单元,但是它们的声明方式、作用域都不太一样。
变量的声明规则:
以下都是合法的变量名:
$abc = 1;
// 驼峰式声明的变量$userName = 1;// 驼峰式声明的方法function getUserName() {}
class UserModel {}
const STATUS = 1;
$price1 = 888;$price2 = $price1;printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 888, price2 = 888
此时修改$price1的值,那么$price2的值会不会变呢?答案是不会边改变的,因为PHP变量默认的是值专递。
$price1 = 999;printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 999, price2 = 888
$price1 = 888;$price2 = &$price1;printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 888, price2 = 888
如果此时我修改了$price1的值,那么$price2的值也会跟着变化的。
$price1 = 999;$price2 = &$price1;printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 999, price2 = 999
引用赋值其实就是给原始变量起一个别名,并未创建新变量。
常量可使用define()函数或者const关键字来声明。
以下是声明常量的案例:
define("ONE", 1);const TWO = ONE * 2;echo ONE; // 1echo TWO; // 2
$_GET,$_POST 和 $_COOKIE 的数组;
echo "IP: {$_SERVER['REMOTE_ADDR']}<br>"; // ::1echo "浏览器: {$_SERVER['HTTP_USER_AGENT']}<br>"; // Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36echo "脚本绝对路径:{$_SERVER['SCRIPT_FILENAME']}<br>"; // E:/phpstudy_pro/WWW/phpcn/PHP/20210126/demo3.phpecho "脚本相对路径:{$_SERVER['SCRIPT_NAME']}<br>"; // /PHP/20210126/demo3.phpecho "当前脚本名称:{$_SERVER['PHP_SELF']}<br>"; // /PHP/20210126/demo3.php
假设当前访问的URL:http://localhost:8888/PHP/20210126/demo3.php?id=1&user=admin&status=1,那么id=1&user=admin&status=1就是查询字符串,这个是为了给GET请求使用的
echo "查询字符串:{$_SERVER['QUERY_STRING']}<br>"; // id=1&user=admin&status=1
假设当前访问的URL:http://localhost:8888/PHP/20210126/demo3.php/id/1/user/admin/status/1.html,那么/id/1/user/admin/status/1.html称为PATH_INFO。可以通过以下方式获取当前URL的PATH_INFO:
echo "PATH_INFO:{$_SERVER['PATH_INFO']}<br>"; // PATH_INFO = /id/1/user/admin/status/1.html
获取当前访问的URI:
echo "URI:{$_SERVER['REQUEST_URI']}<br>"; // /PHP/20210126/demo3.php/id/1/user/admin/status/1.html
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号