PHP变量与常量
一、PHP变量类型与检测
1.1 PHP变量类型转换
1.1.1 临时转换
以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
的类型就转换成整型数值了。
相关的类型转换如下:
- (int): 转换成整型
- (bool): 转换成布尔型
- (float): 转换成浮点型
- (string): 转换成字符串
- (array): 转换成数组
- (object): 转换成对象
注意:临时转换并不会改变变量的原始类型。
1.1.2 自动转换
每一个数据多有它的类型,只有相同类型的数据才能彼此操作。在PHP中,自动转换通常发生在不同数据类型之间的运算。若参与的运算变量的类型不通,则先转换为同一类型,然后再进行运算。
- 有布尔值参与运算时,TRUE将转换为整型1,FALSE将转换为整型0后再参与计算;
- 有NULL参与运算时,NULL值将转换为整型0再参与计算;
- 有int型和float型参与运算时,先把int型的数据转换成float型再进行计算;
- 有字符串和数值型(int,float)参与运算时,字符串先转换成数字,再参与运算。
以下是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
1.1.3 永久转换
永久类型转换只针对变量。
通常,我们使用(string) $value
的类型转换并不会改变原始的$value
的类型,而通过settype()可以改变原始变量的类型:
$price = 1499; // int类型
// 使用settype()改变数据的原始类型
var_dump(settype($price)); // 此时$price的类型就是string了。
1.2 PHP变量类型检测
从之前的学习中,我们可以使用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;
}
总结,常用的数据类型检测如下:
- is_bool(): 判断是否为布尔类型;
- is_int()、is_integer()、is_long(): 判断是否为整型;
- is_float()、is_double()、is_real(): 判断是否为浮点数;
- is_string(): 判断是否为字符串;
- is_array(): 判断是否为数组;
- is_object(): 判断是否为对象;
- is_resource(): 判断是否是资源类型;
- is_null(): 判断是否为空;
- is_scalar(): 判断是否为标量,也就是一个整数、浮点数、布尔类型或者字符串类型。
- is_numeric(): 判断是否是数字类型的字符串;
- is_callable(): 判断是否是有限的函数名。
二、变量与常量的声明方式
变量与常量都是PHP存储数据的单元,但是它们的声明方式、作用域都不太一样。
2.1 变量的声明
变量的声明规则:
- 仅允许使用: 英文字母(a-z,A-Z),数字(0-9),下划线(_)或他们的组合;
- 不允许使用数字开头;
- 必须使用”$”美元符为前缀;
- 严格区分大小写;
- 驼峰命名法。
以下都是合法的变量名:
- 1.普通形式:
$abc = 1;
- 2.驼峰式:适用于变量,对象的属性和方法
// 驼峰式声明的变量
$userName = 1;
// 驼峰式声明的方法
function getUserName() {
}
- 3.帕斯卡:多用于声明类,例如:UserModel,与驼峰很像,也叫大驼峰
class UserModel {
}
- 4.全部大写:一般都用于常量
const STATUS = 1;
2.3 变量赋值
2.3.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
2.3.2 引用赋值
$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
引用赋值其实就是给原始变量起一个别名,并未创建新变量。
2.2 常量的声明
常量可使用define()
函数或者const
关键字来声明。
以下是声明常量的案例:
define("ONE", 1);
const TWO = ONE * 2;
echo ONE; // 1
echo TWO; // 2
2.3 预定义常量
- 超全局变量: 数组,任何地方都可以访问,不受作用域限制;
- \$GLOBALS: 引用全局作用域中可用的全部变量;
- \$_SERVER: 服务器和执行环境信息;
- \$_GET :通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组;
- \$_POST:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本;
- \$_FILES:通过 HTTP POST 方式上传到当前脚本的项目的数组;
- \$_COOKIE:通过 HTTP Cookies 方式传递给当前脚本的变量的数组;
- \$_SESSION:当前脚本可用 SESSION 变量的数组;
- \$_REQUEST: 默认情况下包含了
$_GET
,$_POST
和$_COOKIE
的数组; - \$_ENV: 通过环境方式传递给当前脚本的变量的数组。
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