Blogger Information
Blog 45
fans 3
comment 0
visits 45664
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
初识PHP变量与常量
残破的蛋蛋
Original
757 people have browsed it

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
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post