Skip to content

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; // 输出: 1

1.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; // 输出: 1

2. 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 Website

2.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];  // 输出: red

3. 常量的命名规则

  • 大写字母:常量名通常使用全大写字母
  • 下划线分隔:使用下划线分隔单词
  • 语义化:常量名应该能清楚地表达常量的用途
  • 避免保留字:不要使用 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 Website

7. 类常量

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 Website

7.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 Constant

8. 最佳实践

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 代码。

© 2026 编程马·菜鸟教程 版权所有