Appearance
4.3 常量 define /const
常量是 PHP 中一种特殊的变量类型,一旦定义就不能被修改。本文将介绍如何使用 define() 函数和 const 关键字定义常量。
1. 常量的定义
1.1 使用 define() 函数
php
// 基本语法
define('CONSTANT_NAME', 'constant_value');
// 示例
define('SITE_NAME', 'My Website');
define('MAX_USERS', 1000);
define('DEBUG_MODE', true);
// 访问常量
echo SITE_NAME; // 输出: My Website
echo MAX_USERS; // 输出: 1000
echo DEBUG_MODE; // 输出: 11.2 使用 const 关键字
php
// 基本语法
const CONSTANT_NAME = 'constant_value';
// 示例
const SITE_NAME = 'My Website';
const MAX_USERS = 1000;
const DEBUG_MODE = true;
// 访问常量
echo SITE_NAME; // 输出: My Website
echo MAX_USERS; // 输出: 1000
echo DEBUG_MODE; // 输出: 12. define() 与 const 的区别
| 特性 | define() | const |
|---|---|---|
| 定义位置 | 可以在任何位置定义 | 只能在全局作用域或类内部定义 |
| 定义时间 | 运行时定义 | 编译时定义 |
| 支持表达式 | PHP 5.6+ 支持 | PHP 5.6+ 支持 |
| 大小写敏感 | 默认大小写敏感,可设置为不敏感 | 始终大小写敏感 |
| 支持数组 | PHP 7.0+ 支持 | PHP 5.6+ 支持 |
| 类常量 | 不支持 | 支持 |
2.1 示例:大小写不敏感的常量
php
// 定义大小写不敏感的常量
define('SITE_NAME', 'My Website', true);
// 访问常量
echo SITE_NAME; // 输出: My Website
echo site_name; // 输出: My Website
echo Site_Name; // 输出: My Website2.2 示例:数组常量
php
// 使用 define() 定义数组常量 (PHP 7.0+)
define('COLORS', ['red', 'green', 'blue']);
echo COLORS[0]; // 输出: red
// 使用 const 定义数组常量 (PHP 5.6+)
const COLORS = ['red', 'green', 'blue'];
echo COLORS[0]; // 输出: red3. 常量的命名规则
- 大写字母:常量名通常使用全大写字母
- 下划线分隔:使用下划线分隔单词
- 语义化:常量名应该能清楚地表达常量的用途
- 避免保留字:不要使用 PHP 保留字作为常量名
3.1 示例
php
// 有效的常量名
define('MAX_WIDTH', 1024);
define('DB_HOST', 'localhost');
define('API_KEY', '1234567890');
// 无效的常量名
define('123_CONST', 'value'); // 不能以数字开头
define('const', 'value'); // 不能使用保留字
define('my_const', 'value'); // 不符合命名规范(应使用全大写)4. 预定义常量
PHP 提供了许多预定义常量,用于获取各种信息:
4.1 魔术常量
| 常量 | 描述 |
|---|---|
__LINE__ | 当前行号 |
__FILE__ | 当前文件的完整路径 |
__DIR__ | 当前文件所在目录 |
__FUNCTION__ | 当前函数名 |
__CLASS__ | 当前类名 |
__TRAIT__ | 当前 trait 名 |
__METHOD__ | 当前方法名 |
__NAMESPACE__ | 当前命名空间 |
4.2 示例:魔术常量
php
echo "当前行号:" . __LINE__ . "<br>";
echo "当前文件:" . __FILE__ . "<br>";
echo "当前目录:" . __DIR__ . "<br>";
function test() {
echo "当前函数:" . __FUNCTION__ . "<br>";
}
test();
class MyClass {
public function myMethod() {
echo "当前类:" . __CLASS__ . "<br>";
echo "当前方法:" . __METHOD__ . "<br>";
}
}
$obj = new MyClass();
$obj->myMethod();4.3 其他预定义常量
PHP_VERSION:当前 PHP 版本PHP_OS:当前操作系统PHP_EOL:当前系统的换行符PHP_INT_MAX:最大整数PHP_INT_MIN:最小整数PHP_FLOAT_MAX:最大浮点数PHP_FLOAT_MIN:最小浮点数PHP_ERROR_LOG:错误日志路径
5. 常量的使用场景
5.1 配置信息
php
// 数据库配置
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'test');
// 网站配置
define('SITE_NAME', 'My Website');
define('SITE_URL', 'http://localhost');
define('DEBUG_MODE', true);
// API 配置
define('API_KEY', '1234567890');
define('API_URL', 'https://api.example.com');5.2 状态码
php
// HTTP 状态码
define('HTTP_OK', 200);
define('HTTP_BAD_REQUEST', 400);
define('HTTP_UNAUTHORIZED', 401);
define('HTTP_FORBIDDEN', 403);
define('HTTP_NOT_FOUND', 404);
define('HTTP_INTERNAL_ERROR', 500);
// 业务状态码
define('SUCCESS', 0);
define('ERROR_INVALID_PARAM', 1);
define('ERROR_DATABASE', 2);
define('ERROR_AUTH', 3);5.3 业务常量
php
// 角色权限
define('ROLE_ADMIN', 1);
define('ROLE_USER', 2);
define('ROLE_GUEST', 3);
// 订单状态
define('ORDER_PENDING', 0);
define('ORDER_PAID', 1);
define('ORDER_SHIPPED', 2);
define('ORDER_COMPLETED', 3);
define('ORDER_CANCELLED', 4);
// 产品类型
define('PRODUCT_PHYSICAL', 1);
define('PRODUCT_DIGITAL', 2);
define('PRODUCT_SERVICE', 3);6. 常量的访问
6.1 直接访问
php
echo SITE_NAME;
echo MAX_USERS;6.2 在字符串中使用
php
// 双引号字符串中直接使用
echo "欢迎访问 " . SITE_NAME;
// 或
$message = "网站名称:" . SITE_NAME;
echo $message;6.3 检查常量是否存在
php
if (defined('SITE_NAME')) {
echo SITE_NAME;
} else {
echo '常量未定义';
}6.4 获取常量值
php
$constant_name = 'SITE_NAME';
echo constant($constant_name); // 输出: My Website7. 类常量
7.1 定义类常量
php
class Config {
const SITE_NAME = 'My Website';
const MAX_USERS = 1000;
public static function getSiteName() {
return self::SITE_NAME;
}
}
// 访问类常量
echo Config::SITE_NAME; // 输出: My Website
echo Config::getSiteName(); // 输出: My Website7.2 继承类常量
php
class ParentClass {
const PARENT_CONST = 'Parent Constant';
}
class ChildClass extends ParentClass {
const CHILD_CONST = 'Child Constant';
}
// 访问父类常量
echo ChildClass::PARENT_CONST; // 输出: Parent Constant
// 访问子类常量
echo ChildClass::CHILD_CONST; // 输出: Child Constant8. 最佳实践
8.1 常量命名
- 全大写:使用全大写字母定义常量
- 下划线分隔:使用下划线分隔单词
- 语义化:常量名应该清晰表达其用途
- 前缀:对于特定模块的常量,使用前缀避免冲突
8.2 常量使用
- 配置信息:使用常量存储配置信息
- 固定值:使用常量存储不会变化的值
- 避免魔法数字:使用常量替代魔法数字,提高代码可读性
- 集中管理:将相关常量集中定义在一个文件中
8.3 性能考虑
- 编译时常量:优先使用
const定义常量,因为它是编译时定义的,性能更好 - 运行时常量:仅在需要运行时计算值时使用
define() - 避免频繁定义:不要在循环或函数中频繁定义常量
9. 示例:常量的综合使用
php
<?php
// 配置文件
const SITE_NAME = 'PHP 学习网站';
const SITE_URL = 'http://localhost';
const DEBUG_MODE = true;
// 数据库配置
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'php_learn');
// 业务常量
define('ROLE_ADMIN', 1);
define('ROLE_USER', 2);
define('STATUS_ACTIVE', 1);
define('STATUS_INACTIVE', 0);
// 错误码
define('ERROR_SUCCESS', 0);
define('ERROR_PARAM', 1);
define('ERROR_DATABASE', 2);
// 测试常量
echo "网站名称:" . SITE_NAME . "<br>";
echo "网站 URL:" . SITE_URL . "<br>";
echo "调试模式:" . (DEBUG_MODE ? '开启' : '关闭') . "<br>";
echo "数据库主机:" . DB_HOST . "<br>";
// 检查常量是否存在
if (defined('ROLE_ADMIN')) {
echo "管理员角色 ID:" . ROLE_ADMIN . "<br>";
}
// 动态获取常量
$constant_name = 'SITE_NAME';
echo "动态获取常量:" . constant($constant_name) . "<br>";
// 类常量
class User {
const MAX_LOGIN_ATTEMPTS = 5;
const LOCKOUT_DURATION = 300; // 5分钟
public function getMaxLoginAttempts() {
return self::MAX_LOGIN_ATTEMPTS;
}
}
echo "最大登录尝试次数:" . User::MAX_LOGIN_ATTEMPTS . "<br>";
$user = new User();
echo "最大登录尝试次数(方法):" . $user->getMaxLoginAttempts() . "<br>";
?>10. 总结
常量是 PHP 中存储固定值的重要方式,具有以下特点:
- 不可修改:一旦定义就不能被修改
- 全局访问:在脚本的任何地方都可以访问
- 提高可读性:使用常量可以使代码更加清晰易读
- 集中管理:便于统一管理配置和固定值
通过 define() 函数和 const 关键字,你可以根据不同的场景选择合适的方式定义常量。合理使用常量,可以写出更加规范、可维护的 PHP 代码。
