PHP基础-变量与常量(第八天)
变量与常量
参考文档:https://www.php.net/manual/zh/language.variables.php
一.PHP中什么是变量?
PHP是一种动态网站开发的脚本语言,且区分大小写
动态语言特点是交互性,会有数据的传递,PHP作为"中间人“,需要进行数据的传递,传递的前提就是PHP能自己存储数据(临时存储)
1.1概念
在PHP中,变量(Variable ) 就是用来储存数据的‘容器’。
你可以把它理解为一个盒子,放里面放数据,后续可以随时取出或修改
变量的本质
- 来源:
变量(Variable)最早来源于 数学,表示一个可以变化的量,例如代数里的x
,y
。 - 在计算机语言中:
变量是用来 存储计算结果 或 表示某个值的抽象概念。 - 访问方式:
程序员通过 变量名 来访问存储在变量里的数据,就像数学中用x
来代表一个值。 - 可变性:
在大多数 命令式语言(Imperative Languages) 中,变量的值是可以修改的(即“可变”),所以称为“变量”。
1.2 特点:
1.2.1 在php中变量名前必须有 $
符号
$name = "Tom";
$age = 20;
$name
、$age
就是两个变量。
1.2.2 弱类型语言
在 PHP 里,你不用提前声明变量的类型,它会根据赋的值自动识别:
$x = 100; // 整数
$y = 3.14; // 浮点数
$z = "Hello"; // 字符串
$flag = true; // 布尔值
1.2.3 变量命名规则
- 必须以
$
开头。 - 后面跟字母、数字、下划线,但不能以数字开头。
- 区分大小写(
$name
和$Name
是不同的变量)。 - 有效的变量名由字母(
A-Z
、a-z
或 128 到 255 之间的字节)或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。 按照正常的正则表达式,它将被表述为:^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
。
1.2.4 变量的作用域
- 局部变量:在函数内部声明,只能在函数内部使用。
- 全局变量:函数外声明,要在函数内使用时需要
global
关键字。 - 静态变量:用
static
声明,在函数执行完后不会销毁,下次调用时还能用之前的值
<?php
$greeting = "Hello World"; // 定义变量echo $greeting; // 输出:Hello Worldfunction test() {$localVar = 10; // 局部变量static $count = 0; // 静态变量$count++;echo $count;
}test(); // 输出 1
test(); // 输出 2
?>
二.在php中如何使用变量?
定义->赋值->使用(->删除->垃圾回收)
2.1 定义变量并赋值
2.1.1 基本定义与赋值
在系统中新增对应变量名字(开辟内存)
<?php
$name = "Tom"; // 字符串
$age = 20; // 整数
$price = 9.9; // 浮点数
$isAdmin = true; // 布尔值
?>
注意: $this
是一个特殊的变量,它不能被赋值。PHP 7.1.0 之前,间接赋值(例如通过使用可变变量)是可能的
2.1.2 全局命名空间:
以下代码结构会进入全局命名空间:
- functions(函数)
- classes(类)
- interfaces(接口)
- constants(常量,并非类常量)
- 在函数/方法之外定义的变量
规则
以下列表指出了 PHP 工程在选择新的内部标识符时保留给自己的权利。最终指南是官方的» 编码标准:
- PHP 拥有最顶层命名空间,但是会尝试找到合体的描述命名以避免任何明显的冲突。
- 函数名在两个词中间使用下划线,类名则同时使用
camelCase
和PascalCase
规则。- camelCase(小驼峰命名法)
- 规则:第一个单词首字母小写,后面每个单词的首字母大写
- PascalCase(大驼峰命名法)
- 规则:每个单词的首字母都大写。
- PHP 在任何扩展库的全局符号前附加上扩展库的名称(此规则在过去则有无数例外)。例如:
- curl_close()
- mysql_query()
- PREG_SPLIT_DELIM_CAPTURE
- new DOMDocument()
- strpos()(以前的一个失误例子)
- new SplFileObject()
- Iterators 和 Exceptions 则只是简单加上 “
Iterator
” 和 “Exception
” 后缀。例如:- ArrayIterator
- LogicException
- 迭代器相关类 → 类名以
Iterator
结尾。 - 异常相关类 → 类名以
Exception
结尾。
- PHP 保留所有以
__
开头的符号作为魔术符号。建议用户不要在 PHP 中创建以__
打头的符号,除非是要使用有文档记载的魔术函数功能。例如:(保留的特殊符号)- __get()
- __autoload()
- 之所以叫 “魔术方法/符号”,是因为它们并不是你主动调用的,而是 PHP 在特定场景下 自动触发 的,看起来就像“魔法”一样
- 常见的魔术方法
__construct()
:构造函数,在new
对象时自动调用。__destruct()
:析构函数,在对象销毁时自动调用。__get($name)
:当访问对象中不存在的属性时自动调用。__set($name, $value)
:当给对象中不存在的属性赋值时自动调用。__call($method, $args)
:当调用不存在的方法时自动调用。__toString()
:当对象被当作字符串输出时自动调用。
注意:PHP 中 namespace
声明必须位于文件的最开始,除了 declare
语句外不能有其他任何代码或空白输出 必须顶格否则也会报错
例如
有其他代码
提示
要写出能经受住时间考验的代码,建议在全局的命名空间中,尽量不要用变量、函数或类名,以避免与其它用户空间代码出现命名空间冲突。
防止函数和类的命名冲突的一个常见方法是使用自己专属名字的 namespace。
<?phpnamespace MyProject;function my_function() { return true;}\MyProject\my_function();
这仍然需要你跟踪已经使用过的命名空间,但一旦你用了在决定了要使用的命名空间后,你可以添加所有的函数和类到它,不用再考虑冲突。
最好的做法是,尽量控制一下添加到全局范围内的变量,以防止与第三方代码的命名产生命名空间冲突。
注意: 变量作用域
因为 PHP 的作用域规则,在函数和方法内定义的变量不会在全局作用域内,因此不会和全局作用域内其它定义的变量相冲突。
2.2 使用变量
<?php
$name = "Tom";
echo $name; // 输出 Tom
unset($x); // 删除变量
// echo $x; // 报错:未定义变量
可以通过变量名访问存储的数据
可以将变量从内存中删除
2.3 拼接变量
PHP 常见的输出方式有两种:
方式 A:点号拼接 (.
)
$name = "Tom";
echo "Hello " . $name;
// 输出 Hello Tom
方式 B:双引号内直接写变量
$name = "Tom";
echo "Hello $name";
// 输出 Hello Tom
注意:单引号里的变量不会被解析:
echo 'Hello $name'; // 输出 Hello $name
2.4. 变量的特殊类型
-
变量变量:
$a = "hello"; $b = "a"; echo $$b; // 输出 hello,相当于 echo $a
-
可变变量名:常用于动态生成变量
<?php $fields = ["name" => "Tom", "age" => 20, "gender" => "Male"];foreach ($fields as $key => $value) {$$key = $value; // 根据数组的 key 动态生成变量 }echo $name; // Tom echo $age; // 20 echo $gender; // Male
- 可变变量就是 “变量的名字由另一个变量的值决定”。
- 写法:
$$var
。 - 常用场景:动态生成变量、从数组/数据库结果里创建变量。
三.PHP中的预定义变量
3.1 PHP 超全局变量(Superglobals)/自动全局变量(autoglobals)
3.1.1. 定义
- 超全局变量 是 PHP 内置的一组 预定义数组变量。
- 它们在 每个作用域(函数内、函数外、类内等)都可以直接使用,无需
global
。 - 常被称为 自动全局变量(autoglobals) 或 超全局变量(superglobals)。
3.1.2. 来源
这些数组变量包含的数据,可能来自:
- Web 服务器(如请求头、Cookie、Session)
- 运行环境(如命令行参数、环境变量)
- 用户输入(如表单、URL 参数、上传文件)
3.1.3. 特点
- 自动可用,不需要
global
。 - 用户 不能自定义新的超全局变量(只能用 PHP 内置的)。
3.1.4 常用的有哪些?
超全局变量 | 说明 |
---|---|
$_GET | URL 查询字符串参数(GET 请求参数) |
$_POST | 表单提交数据(POST 请求参数) |
$_REQUEST | 包含 $_GET 、$_POST 和 $_COOKIE 的数据 |
$_COOKIE | Cookie 数据 |
$_SESSION | Session 数据 |
$_FILES | 用户上传的文件信息 |
$_SERVER | 服务器和执行环境信息 |
$_ENV | 环境变量 |
$_GLOBALS | 引用所有全局作用域中的变量 |
3.1.5 如何使用?
//例如 在浏览器输入http://example.com/test.php?id=123
<?php
echo $_GET['id']; // 获取 URL 参数 id
echo $_SERVER['PHP_SELF']; // 当前脚本路径
?>
四.变量传值
4.1 在内存中通常有哪些分区?
4.1.1. 代码区(Text Segment)
- 内容:存放程序的机器指令(可执行代码)。
- 特点:
- 通常是只读的,防止程序意外修改自己。
- 在程序运行时一般是共享的,不同进程可共享同一程序的代码段。
- 不执行
4.1.2. 数据区(Data Segment)
用于存放已初始化的全局变量和静态变量:
- 初始化数据段(Initialized Data Segment)
- 存储程序中显式初始化过的全局变量和静态变量。
- 例如:
int a = 5;
就放在这里。
- 未初始化数据段 / BSS段(Uninitialized Data / BSS Segment)
- 存储程序中未初始化的全局变量和静态变量。
- 系统启动时会自动初始化为 0。
- 例如:
static int b;
。
4.1.3. 堆(Heap)
- 内容:存放动态分配的内存,如
malloc
/new
分配的对象。 - 特点:
- 由程序员控制分配和释放。
- 向上增长(在大多数系统中,堆从低地址向高地址增长)。
- 储存复杂数据。大但是效率低
4.1.4. 栈(Stack)
- 内容:存放函数调用相关的信息:
- 函数的局部变量
- 函数参数
- 返回地址
- 特点:
- 由操作系统自动分配和释放。
- 向下增长(在大多数系统中,栈从高地址向低地址增长)。
- 支持递归调用。
- 栈溢出:当调用层次过深或局部变量占用过大时,会出现“Stack Overflow”。
- 程序可以操作的内存(不储存数据,只运行程序代码),少但是快
4.1.5. 其他(可选 / 系统相关)
- 内核空间:
- 存放操作系统核心数据和代码。
- 用户进程通常不能直接访问。
- 内存映射区(Memory-mapped Segment):
- 存放动态链接库(DLL / SO)、共享内存等。
- 通过 mmap 等机制映射到进程虚拟地址空间。
4.1.6示意图
高地址
+-------------------+
| 栈(Stack) | <- 向下增长
+-------------------+
| 动态库/映射区 |
+-------------------+
| 堆(Heap) | <- 向上增长
+-------------------+
| 数据段(Data/BSS) |
+-------------------+
| 代码段(Text) |
+-------------------+
低地址
内存里每个存储单元都有一个编号,这个编号叫地址(Address)。
地址是一个数字,从 0 开始,像房间号一样,每个格子能存储一些数据。
内存地址 越大 → 越靠“高”位置;地址 越小 → 越靠“低”位置。
内存分区告诉你 程序的数据都放哪里:
- 局部变量 → 栈
- 全局/静态变量 → 数据段
- 动态分配对象 → 堆
- 代码 → 代码段
4.2 值传值和引用传值是怎么样的?
PHP 的特点是:
- 默认 都是值传递(也就是函数得到的是参数的副本)
- 可以通过 引用符号
&
来实现引用传递
4.2.1 值传递(默认方式)
<?php
function addOne($x) {$x = $x + 1;
}$a = 5;
addOne($a);
echo $a; // 输出 5
?>
解释:
$x
是$a
的副本- 改
$x
不影响$a
4.2.2 引用传递(用 &)
<?php
function addOneRef(&$x) {$x = $x + 1;
}$a = 5;
addOneRef($a);
echo $a; // 输出 6
?>
解释:
&$x
表示传 引用,函数操作的是$a
的本体- 改
$x
就改$a
4.2.3 PHP 对象的特殊情况
- PHP 5+ 对象是 默认按引用传递的值
- 但注意,传递的是 对象的引用的副本
- 修改对象内部属性会影响外部对象,但把参数指向新对象不会改变原对象
<?php
class Person {public $name;
}function rename($p) {$p->name = "Alice"; // 修改对象属性
}$p = new Person();
$p->name = "Bob";
rename($p);
echo $p->name; // 输出 Alicefunction change($p) {$p = new Person(); // 改指针指向新对象$p->name = "Charlie";
}change($p);
echo $p->name; // 仍然是 Alice,不会变成 Charlie
?>
总结 PHP 中的规则:
- 基本类型(int、string、array 等)默认值传递
- 用
&
才能改原变量
- 用
- 对象默认按“引用的值”传递
- 修改属性会影响原对象
- 重新赋值给新对象不会影响原对象
五.什么是常量?
5.1 定义
常量是一个简单值的标识符(名字),它在脚本执行期间不能被改变。
例外是 PHP 的“魔术常量”,它们的值在不同环境下会自动变化,但本质上也属于常量。
简单来说就是一旦定义且赋值后值就不可改变
-
PHP 内置的特殊常量,比如:
__FILE__ // 当前文件的完整路径 __LINE__ // 当前行号 __DIR__ // 当前目录 __FUNCTION__ // 当前函数名
-
特点:
- 它们在不同的上下文环境下会返回不同的值(例如
__LINE__
在不同的代码行返回不同的行号)。 - 你不能给它们重新赋值,也不能
define("__FILE__", "xxx")
。
- 它们在不同的上下文环境下会返回不同的值(例如
特点
- 值不可修改:一旦定义,就不能再改变。
- 大小写敏感:默认情况下,常量的名称是大小写敏感的。
- 传统命名:常量通常使用全大写字母来命名,以便与变量区分。
5.2 定义常量的方法
PHP 有两种常见方式定义常量:(5.3以后才有两种)
5.2. 1 方式一:使用 define()
支持版本:(PHP 4, PHP 5, PHP 7, PHP 8)
1.语法:define(string $constant_name
, mixed $value
, bool $case_insensitive
= false
): bool
2.参数说明:
参数 | 类型 | 含义 |
---|---|---|
$constant_name | string | 要定义的常量名,必须是字符串 |
$value | mixed | 常量的值,可以是字符串、数字、布尔值,PHP 5.6+ 支持数组 |
$case_insensitive | bool(可选) | 是否忽略大小写,默认 false 。PHP 7.3+ 已废弃,不推荐使用 |
3.返回值:
- 返回类型:
bool
- 如果定义成功返回
true
,失败返回false
(例如常量名已存在)。
4.示例:
define("PI", 3.14159); // 返回 true
define("GREETING", "Hello World", true); // PHP 7.3+ 不推荐使用
echo PI; // 输出 3.14159
5.2.2 方式二:使用 const
(适用于类常量和全局常量 5.3以后才有)
const GREETING = "Hello, world!";
echo GREETING; // 输出 Hello, world!
5.2.3 defined 函数
检查是否定义了某常量,使用defined()](https://www.php.net/manual/zh/function.defined.php) 函数。
语法:defined(string $constant_name
): bool
示例:
/* 注意引号的使用,这很重要。这个例子是检查* 如果字符串 'TEST' 是 TEST 常量的名称 */
if (defined('TEST')) {echo TEST;
}
interface bar {const test = 'foobar!';
}class foo {const test = 'foobar!';
}var_dump(defined('bar::test')); // bool(true)
var_dump(defined('foo::test')); // bool(true)
5.2.4 constant()函数
使用 define() 函数来定义包含保留字或非常规名称的常量,这类常量可以通过 constant() 函数来获取名称,但是非常不推荐这种用法
语法:constant(string $name
): mixed
5.2.5 get_defined_constants() 函数
可以获得所有已定义的常量列表
语法:get_defined_constants(bool $categorize
= false
): array
参数:$categorize
:是否按类别(如 “user”、“Core”、“date” 等)返回,默认 false
返回扁平数组。
示例:
define("PI", 3.14159);
define("GREETING", "Hello");print_r(get_defined_constants(true));
/*
输出示例:
Array
([user] => Array([PI] => 3.14159[GREETING] => Hello)...
)
*/
运行结果如图:
要想有格式
<?phpdefine("PI", 3.14159);define("GREETING", "Hello");echo '<pre>';print_r(get_defined_constants(true));echo '</pre>';
?>
如图
5.3注意事项
-
常量可以是字符串、整数、浮点数或布尔值,但不能是数组(PHP 5.6+ 支持数组常量)。
-
不像变量,常量前面不需要
$
符号。 -
常量定义的时候必须赋值
-
常量名一般是大写字母为主(与变量以示区分)
-
定义特殊常量只能用define,
define()
不受标识符规则限制,可以用特殊字符 -
使用 define() 函数来定义包含保留字或非常规名称的常量,这类常量可以通过 constant() 函数来获取名称,但是非常不推荐这种用法
-
define("-_- ",'smile') const -_- = 'smile'; //会报错 Parse error: syntax error, unexpected single-quoted string "-_-", expecting identifier echo constant("-_-"); // 输出 smile
-
-
const
只能用于合法的标识符(字母、数字、下划线,且不能以数字开头) -
常量的范围是全局的。常量可以从脚本的任何地方被访问,而不考虑作用域
-
从 PHP 7.1.0 开始,类常量可以声明为 protected 或 private 的可见性, 使其只在其定义的类的层次范围内可用。
-
在 PHP 8.0.0 之前,使用 define() 定义的常量可能不区分大小写。
5.4 预定义常量(系统常量)有哪些常用的?
5.4.1 错误与调试相关常量
常量 | 说明 |
---|---|
E_ERROR | 致命运行错误 |
E_WARNING | 运行警告(非致命) |
E_NOTICE | 普通提示信息 |
E_ALL | 所有错误和警告 |
用于
error_reporting()
或判断错误类型。
5.4.2 PHP 配置常量
常量 | 说明 |
---|---|
PHP_VERSION | 当前 PHP 版本 |
PHP_MAJOR_VERSION | PHP 主版本号 |
PHP_MINOR_VERSION | PHP 次版本号 |
PHP_RELEASE_VERSION | PHP 修订版本号 |
PHP_OS | 操作系统名称 |
PHP_SAPI | PHP 运行方式(如 cli、apache2handler) |
5.4.3 魔术常量(Magic Constants)
这种双下划线开始+常量名+双下划线结束的常来那个味系统魔术常量,会随着环境变化,但是用户改变不了
常量 | 说明 |
---|---|
__LINE__ | 当前所属行号 |
__FILE__ | 当前被执行的脚本文件所在电脑的完整路径(绝对路径) |
__DIR__ | 当前被执行的脚本文件所在电脑的目录(绝对路径) |
__FUNCTION__ | 当前函数名 |
__CLASS__ | 当前所属类名 |
__METHOD__ | 当前所属方法名 |
__NAMESPACE__ | 当前命名空间名 |
注意:魔术常量 值会随上下文改变,但本质是不可修改的常量。
尝试:
<?php
class Index
{public function __construct(){echo __CLASS__ . '-当前类名<br/>';echo __FUNCTION__ . '-当前函数名<br/>';echo __METHOD__ . '-当前方法名<br/>';}
}//常用魔术常量
echo __FILE__ . '-当前文件名<br/>';
echo __LINE__ . '-当前行号<br/>';
echo __DIR__ . '-当前目录<br/>';
new Index();echo '<br/>';
echo '<br/>';
echo '<br/>';
echo '<br/>';
显示结果如下:
5.3.4 整型相关常量
常量 | 说明 |
---|---|
PHP_INT_MAX | PHP 整型最大值 整型能表示的最大值 |
PHP_INT_MIN | PHP 整型最小值(PHP 7.0+)整型能表示的最小值 |
PHP_INT_SIZE | PHP 整型占用的字节数(4 或 8) |
如图所示:
echo PHP_INT_SIZE . '-整型SIZE<br/>';
echo PHP_INT_MIN . '-整型最小值<br/>';
echo PHP_INT_MAX . '-整型最大值<br/>';
5.4.5 其他常用系统常量
常量 | 说明 |
---|---|
TRUE 、FALSE | 布尔值 |
NULL | 空值 |
PHP_EOL | 换行符(跨平台) |
DIRECTORY_SEPARATOR | 目录分隔符(Windows \ ,Linux / ) |
PATH_SEPARATOR | 路径分隔符(Windows ; ,Linux : ) |