博客列表 >初识PHP变量与常量

初识PHP变量与常量

残破的蛋蛋
残破的蛋蛋原创
2021年01月27日 18:31:22763浏览

PHP变量与常量

一、PHP变量类型与检测

1.1 PHP变量类型转换

1.1.1 临时转换

以url中的查询字符串http://localhost/user?id=1为例,其中id=1就叫查询字符串,此时打印id的值:

  1. $id = $_GET['id'];
  2. var_dump($id); // string(1) "1"

结果发现$id的值为“1”,是一个字符串,如果此时我们判断$id的值是否为1,

  1. if ($id === 1) {
  2. echo "找到了该用户!";
  3. } else {
  4. echo "未找到该用户!";
  5. }

以上结果会输出:未找到该用户!,这是因为我们的$id的值是一个字符串,而与之比较的值是一个整型数值1,因此我们要对变量$id进行转换:

  1. if ((int)$id === 1) {
  2. echo "找到了该用户!";
  3. } else {
  4. echo "未找到该用户!";
  5. }

此时,变量$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自动类型转换的例子,是使用“+”进行运算的。如果任意一个运算数是浮点数,则所有的运算数都被当成浮点数,结果也是一个浮点数。

  1. $foo = "100abc"; // 声明一个字符串变量$foo
  2. $foo += 2; // $foo现在是一个整型,值为102
  3. $foo += 1.3; // $foo现在是一个float型,值为103.3
  4. $foo = null + "10 abc def"; // $foo是一个整型,值为10
  5. $foo = null + "10.3 abc def"; // $foo是float型,值为10.3

1.1.3 永久转换

永久类型转换只针对变量。

通常,我们使用(string) $value的类型转换并不会改变原始的$value的类型,而通过settype()可以改变原始变量的类型:

  1. $price = 1499; // int类型
  2. // 使用settype()改变数据的原始类型
  3. var_dump(settype($price)); // 此时$price的类型就是string了。

1.2 PHP变量类型检测

从之前的学习中,我们可以使用var_dump()函数来查看某个表达式的值和类型,但是我们还可以通过PHP提供的一些特定函数测试每个变量的类型。

变量类型检测函数使用方法案例:

  1. $bool = TRUE; // 定义一个布尔型变量
  2. $str = "foo"; // 定义一个字符串类型变量
  3. $int = 100; // 定义一个整型变量

使用gettype()函数输出$bool的变量类型:boolean。

  1. echo gettype($bool);

使用var_dump()函数直接输出变量$str的类型和值。

  1. var_dump($str);

通过is_int()函数判断$int是否为整型变量,此时会输出$int is 104

  1. if (is_int($int)) {
  2. $int += 4;
  3. echo '$int is ' . $int;
  4. }

通过is_string()函数判断当前变量是否为字符串类型,此时会输出else里面的内容:$bool is not a string,因为$bool并不是一个字符串类型的变量。

  1. if (is_string($bool)) {
  2. echo '$bool is a string valued:' . $bool;
  3. } else {
  4. echo '$bool is not a string';
  5. }

通过is_bool()函数判断当前变量是否为布尔值类型,此时会输出$bool is boolean: 1

  1. if (is_bool($bool)) {
  2. echo '$bool is boolean: ' . $bool;
  3. }

总结,常用的数据类型检测如下:

  • 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.普通形式:
  1. $abc = 1;
  • 2.驼峰式:适用于变量,对象的属性和方法
  1. // 驼峰式声明的变量
  2. $userName = 1;
  3. // 驼峰式声明的方法
  4. function getUserName() {
  5. }
  • 3.帕斯卡:多用于声明类,例如:UserModel,与驼峰很像,也叫大驼峰
  1. class UserModel {
  2. }
  • 4.全部大写:一般都用于常量
  1. const STATUS = 1;

2.3 变量赋值

2.3.1 值传递(默认传值方式)

  1. $price1 = 888;
  2. $price2 = $price1;
  3. printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 888, price2 = 888

此时修改$price1的值,那么$price2的值会不会变呢?答案是不会边改变的,因为PHP变量默认的是值专递。

  1. $price1 = 999;
  2. printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 999, price2 = 888

2.3.2 引用赋值

  1. $price1 = 888;
  2. $price2 = &$price1;
  3. printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 888, price2 = 888

如果此时我修改了$price1的值,那么$price2的值也会跟着变化的。

  1. $price1 = 999;
  2. $price2 = &$price1;
  3. printf('price1 = %d, price2 = %d', $price1, $price2); // price1 = 999, price2 = 999

引用赋值其实就是给原始变量起一个别名,并未创建新变量。

2.2 常量的声明

常量可使用define()函数或者const关键字来声明。

以下是声明常量的案例:

  1. define("ONE", 1);
  2. const TWO = ONE * 2;
  3. echo ONE; // 1
  4. 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: 通过环境方式传递给当前脚本的变量的数组。
  1. echo "IP: {$_SERVER['REMOTE_ADDR']}<br>"; // ::1
  2. 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
  3. echo "脚本绝对路径:{$_SERVER['SCRIPT_FILENAME']}<br>"; // E:/phpstudy_pro/WWW/phpcn/PHP/20210126/demo3.php
  4. echo "脚本相对路径:{$_SERVER['SCRIPT_NAME']}<br>"; // /PHP/20210126/demo3.php
  5. 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请求使用的

  1. 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:

  1. echo "PATH_INFO:{$_SERVER['PATH_INFO']}<br>"; // PATH_INFO = /id/1/user/admin/status/1.html

获取当前访问的URI:

  1. echo "URI:{$_SERVER['REQUEST_URI']}<br>"; // /PHP/20210126/demo3.php/id/1/user/admin/status/1.html
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议