在PHP开发中,常量是一个常用的特性,它的值在脚本执行期间不能被修改。但如果在代码中多次对同一个常量执行定义操作,PHP会抛出警告错误,严重的话可能导致后续逻辑无法正常执行。为了避免这种情况,我们可以使用defined函数先检查常量是否已经存在,再决定是否进行定义。

defined函数的基本介绍
defined是PHP内置的一个函数,它的作用是检查指定的常量是否已经定义。如果常量已经被定义,函数返回true,否则返回false。它的语法格式非常简单,只需要传入常量的名称字符串作为参数即可。
下面是一个最基础的defined函数使用示例:
<?php
// 检查常量TEST是否存在
if (defined('TEST')) {
echo 'TEST常量已经被定义';
} else {
echo 'TEST常量尚未被定义';
}
?>
结合defined和define防止重复定义
define函数的作用是定义一个新常量,它的第一个参数是常量名称,第二个参数是常量的值。如果定义的常量已经存在,define会返回false并触发警告。我们可以在调用define之前,先用defined检查常量是否存在,只有不存在的时候才执行定义操作。
具体的实现代码如下:
<?php
// 定义常量之前先检查
if (!defined('SITE_NAME')) {
define('SITE_NAME', '我的个人站点');
}
// 后续再次尝试定义同名常量,不会触发错误
if (!defined('SITE_NAME')) {
define('SITE_NAME', '新的站点名称');
}
echo SITE_NAME; // 输出:我的个人站点
?>
上面的代码中,第一次检查到SITE_NAME常量不存在,所以执行了define定义。第二次检查的时候,SITE_NAME已经被定义,所以不会再次执行define,避免了重复定义的问题。
常见使用场景
配置文件引入场景
在PHP项目中,我们通常会把常量定义放在配置文件里,如果配置文件被多次引入,就会出现重复定义的问题。在配置文件开头使用defined检查就可以很好地解决这个问题:
<?php
// config.php 配置文件内容
if (!defined('CONFIG_LOADED')) {
define('CONFIG_LOADED', true);
define('DB_HOST', '127.0.0.1');
define('DB_USER', 'root');
define('DB_PASS', '123456');
}
?>
这样即使config.php被多次require或者include,常量也只会被定义一次,不会触发错误。
公共函数库场景
如果我们在公共函数库中定义一些通用常量,同样可以使用这种方式避免重复定义:
<?php
// common.php 公共函数库
if (!defined('MAX_UPLOAD_SIZE')) {
define('MAX_UPLOAD_SIZE', 1024 * 1024 * 10); // 10M
}
if (!defined('CACHE_EXPIRE')) {
define('CACHE_EXPIRE', 3600); // 缓存过期时间1小时
}
?>
注意事项
- defined函数的参数必须是常量的名称字符串,不要直接传入常量本身,否则会先解析常量的值再检查,可能导致错误。
- 常量的名称是区分大小写的,defined('TEST')和defined('test')检查的是两个不同的常量,定义的时候也要注意大小写统一。
- 如果是使用const关键字定义常量,同样可以用defined先检查,const定义常量的方式和define略有不同,但检查逻辑是一致的。
使用defined函数提前检查再定义常量,是PHP开发中避免常量重复定义的简单有效方法,掌握这个技巧可以让你的代码更加健壮,减少不必要的运行时错误。