当前位置: 首页 > news >正文

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-Za-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 拥有最顶层命名空间,但是会尝试找到合体的描述命名以避免任何明显的冲突。
  • 函数名在两个词中间使用下划线,类名则同时使用 camelCasePascalCase 规则。
    • 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 常用的有哪些?
超全局变量说明
$_GETURL 查询字符串参数(GET 请求参数)
$_POST表单提交数据(POST 请求参数)
$_REQUEST包含 $_GET$_POST$_COOKIE 的数据
$_COOKIECookie 数据
$_SESSIONSession 数据
$_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 中的规则

  1. 基本类型(int、string、array 等)默认值传递
    • & 才能改原变量
  2. 对象默认按“引用的值”传递
    • 修改属性会影响原对象
    • 重新赋值给新对象不会影响原对象

五.什么是常量?

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_namestring要定义的常量名,必须是字符串
$valuemixed常量的值,可以是字符串、数字、布尔值,PHP 5.6+ 支持数组
$case_insensitivebool(可选)是否忽略大小写,默认 falsePHP 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_VERSIONPHP 主版本号
PHP_MINOR_VERSIONPHP 次版本号
PHP_RELEASE_VERSIONPHP 修订版本号
PHP_OS操作系统名称
PHP_SAPIPHP 运行方式(如 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_MAXPHP 整型最大值 整型能表示的最大值
PHP_INT_MINPHP 整型最小值(PHP 7.0+)整型能表示的最小值
PHP_INT_SIZEPHP 整型占用的字节数(4 或 8)

如图所示:

echo PHP_INT_SIZE . '-整型SIZE<br/>';
echo PHP_INT_MIN . '-整型最小值<br/>';
echo PHP_INT_MAX . '-整型最大值<br/>';

请添加图片描述

5.4.5 其他常用系统常量
常量说明
TRUEFALSE布尔值
NULL空值
PHP_EOL换行符(跨平台)
DIRECTORY_SEPARATOR目录分隔符(Windows \,Linux /
PATH_SEPARATOR路径分隔符(Windows ;,Linux :
http://www.dtcms.com/a/389034.html

相关文章:

  • SQ01,SQ02,SQ03,SE93事务码配置
  • AI提示词Excel 表格提取数据准确度处理
  • DeviceNet 转 EtherNet/IP 实现罗克韦尔 PLC 与库卡机器人在汽车白车身焊接的微秒级数据同步协作案例
  • GPT-5 vs Gemini 2.5 Pro:两大AI旗舰模型深度技术对比
  • 31、GPT核心引擎完整手工构建:从算法原理到工程优化(Generative Pre-trained Transformer)
  • MySQL MHA 完整配置与故障后原主库还原指南
  • 栈-946.验证栈序列-力扣(LeetCode)
  • spring boot3.0整合rabbitmq3.13
  • Scrapy爬虫利器:CrawlSpider详解
  • 从零开始学Flink:数据源
  • GRPO算法复现
  • AI+Flask博客项目实战提示词笔记 20250918
  • 无人设备遥控器之时间戳技术篇
  • 模块四 展望微服务
  • RN 添加 <NavigationContainer>组件报错
  • 深入理解 AVL 树
  • 软考中级习题与解答——第八章_计算机网络(2)
  • FinalShell远程连接CentOS下方文件列表信息不显示且刷新报空指针异常
  • 贪心算法应用:线性规划贪心舍入问题详解
  • 设计模式学习笔记(二)
  • 轻量化录屏插件,MP4输出格式
  • 静态代理 设计模式
  • Salesforce知识点:触发器:自动化业务逻辑的核心工具详解
  • CentOS 8.5部署Zabbix6.0 agent2端
  • 【TestCenter】设置DHCP Option
  • Jenkins 安全清理孤立工作区(workspace)的 Shell 脚本:原理、实现与实战
  • WebDancer论文阅读
  • Node.js、npm 和 npx:前端开发的三剑客
  • Node.js 创建 UDP 服务
  • 【NodeJS 二维码】node.js 怎样读取二维码信息?