以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; // 1
echo TWO; // 2
$_GET
,$_POST
和 $_COOKIE
的数组;
echo "IP: {$_SERVER['REMOTE_ADDR']}<br>"; // ::1
echo "浏览器: {$_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.36
echo "脚本绝对路径:{$_SERVER['SCRIPT_FILENAME']}<br>"; // E:/phpstudy_pro/WWW/phpcn/PHP/20210126/demo3.php
echo "脚本相对路径:{$_SERVER['SCRIPT_NAME']}<br>"; // /PHP/20210126/demo3.php
echo "当前脚本名称:{$_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