预定义常量
PHP 在运行时提供了大量的预定义常量,它们由 PHP 核心和各个扩展库定义。这些常量无需手动定义即可直接在代码中使用,涵盖了 PHP 版本信息、错误报告级别、操作系统信息等方方面面。
前置知识
- 已掌握 常量语法 的基本用法
- 了解
defined()函数检测常量是否存在 - 熟悉 PHP 扩展库的概念
基础概念
预定义常量可以分为以下几大类:
| 类别 | 说明 | 示例 |
|---|---|---|
| 核心常量 | PHP 语言核心提供的常量 | PHP_INT_MAX, PHP_EOL |
| PHP 版本常量 | PHP 版本相关信息 | PHP_MAJOR_VERSION, PHP_VERSION |
| 错误常量 | 错误报告级别 | E_ALL, E_ERROR, E_WARNING |
| 标准预定义常量 | 通用语言常量 | true, false, null |
| 扩展库常量 | 各扩展库定义的常量 | PDO::FETCH_ASSOC, SORT_ASC |
扩展库常量的可用性
许多预定义常量由不同的扩展库定义,只有在加载了相应的扩展后才会存在。可以通过 get_loaded_extensions() 查看已加载的扩展,通过 get_defined_constants(true) 按类别查看所有常量。
PHP 核心常量
PHP 版本相关常量
PHP 提供了一系列版本相关的常量,便于编写兼容性代码:
php
<?php
declare(strict_types=1);
// PHP 版本信息
echo PHP_VERSION . "\n"; // 完整版本号,如 "8.3.0"
echo PHP_MAJOR_VERSION . "\n"; // 主版本号,如 8
echo PHP_MINOR_VERSION . "\n"; // 次版本号,如 3
echo PHP_RELEASE_VERSION . "\n"; // 发布版本号,如 0
echo PHP_VERSION_ID . "\n"; // 整数版本号,如 80300
echo PHP_EXTRA_VERSION . "\n"; // 额外版本标识,如 ""
// 版本比较
if (PHP_VERSION_ID >= 80100) {
echo "PHP 8.1+ features available\n";
}PHP 整数和浮点数常量
php
<?php
declare(strict_types=1);
// 整数相关
echo PHP_INT_SIZE . "\n"; // 整数大小(字节数),如 8
echo PHP_INT_MAX . "\n"; // 最大整数值,如 9223372036854775807
echo PHP_INT_MIN . "\n"; // 最小整数值,PHP 7.0+
echo PHP_INT_MAX - 1 . "\n"; // 安全整数计算
// 浮点数相关
echo PHP_FLOAT_MAX . "\n"; // 最大浮点数
echo PHP_FLOAT_MIN . "\n"; // 最小正浮点数
echo PHP_FLOAT_EPSILON . "\n"; // 最小可表示的正浮点数(机器精度)
// 字节大小常量
echo PHP_BYTES_PER_WORD . "\n"; // 每个字的大小
echo PHP_BINDIR . "\n"; // PHP 二进制文件所在目录PHP 平台和环境常量
php
<?php
declare(strict_types=1);
// 操作系统信息
echo PHP_OS . "\n"; // 操作系统,如 "Linux" 或 "WINNT"
echo PHP_OS_FAMILY . "\n"; // OS 家族,如 "Linux" 或 "Windows"
echo PHP_SAPI . "\n"; // 服务器 API,如 "cli" 或 "apache2handler"
// 路径相关
echo PHP_BINARY . "\n"; // PHP 可执行文件路径
echo PHP_BINDIR . "\n"; // PHP 二进制目录
echo PHP_LIBDIR . "\n"; // PHP 库目录
echo PHP_DATADIR . "\n"; // PHP 数据目录
echo PHP_CONFIG_FILE_PATH . "\n"; // php.ini 路径
// 使用 php_uname() 获取更详细的系统信息
echo php_uname() . "\n"; // 完整系统信息
echo php_uname("s") . "\n"; // 操作系统名称
echo php_uname("r") . "\n"; // 版本号
echo php_uname("m") . "\n"; // 机器类型其他核心常量
php
<?php
declare(strict_types=1);
// 行结束符
echo PHP_EOL; // 当前平台的换行符("\n" 或 "\r\n")
// 默认字符集
echo PHP_EOL; // 换行符
echo PHP_INT_MAX . "\n"; // 最大整数
// 目录分隔符
echo DIRECTORY_SEPARATOR . "\n"; // "/" (Linux/Mac) 或 "\" (Windows)
echo PATH_SEPARATOR . "\n"; // ":" (Linux/Mac) 或 ";" (Windows)
// 最大值常量
echo PHP_MAXPATHLEN . "\n"; // 路径最大长度错误报告常量
PHP 定义了一组错误级别常量,用于控制错误报告行为:
php
<?php
declare(strict_types=1);
// 常用错误级别
echo E_ERROR . "\n"; // 1 - 致命错误
echo E_WARNING . "\n"; // 2 - 运行时警告
echo E_PARSE . "\n"; // 4 - 编译时解析错误
echo E_NOTICE . "\n"; // 8 - 运行时通知
echo E_CORE_ERROR . "\n"; // 16 - PHP 核心启动时的致命错误
echo E_CORE_WARNING . "\n"; // 32 - PHP 核心启动时的警告
echo E_USER_ERROR . "\n"; // 256 - 用户产生的致命错误
echo E_USER_WARNING . "\n"; // 512 - 用户产生的警告
echo E_USER_NOTICE . "\n"; // 1024 - 用户产生的通知
echo E_STRICT . "\n"; // 2048 - 运行时建议
echo E_RECOVERABLE_ERROR . "\n"; // 4096 - 可捕获的致命错误(PHP 5.2+)
echo E_DEPRECATED . "\n"; // 8192 - 运行时弃用通知(PHP 8.0+)
echo E_USER_DEPRECATED . "\n"; // 16384 - 用户产生的弃用通知
// 组合使用
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
// 开发环境推荐
error_reporting(E_ALL);
// 生产环境推荐
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);PHP 8.0 变更
PHP 8.0 起,默认的 error_reporting 级别为 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED。
详细说明
标准预定义常量
PHP 有几个内置的标准常量:
| 常量 | 值 | 说明 |
|---|---|---|
true | true | 布尔真值 |
false | false | 布尔假值 |
null | null | 空值 |
PHP_EOL | 平台相关 | 行结束符 |
php
<?php
declare(strict_types=1);
// true 和 false 是布尔常量,不区分大小写
var_dump(true, TRUE, True); // bool(true), bool(true), bool(true)
var_dump(false, FALSE, False); // bool(false), bool(false), bool(false)
// null 也是不区分大小写的
var_dump(null, NULL, Null); // NULL, NULL, NULL使用 get_defined_constants() 探索常量
php
<?php
declare(strict_types=1);
// 获取所有常量(分类)
$constants = get_defined_constants(true);
// 输出各类别的常量数量
foreach ($constants as $category => $consts) {
$count = count($consts);
echo "{$category}: {$count} constants\n";
}
// 查找特定常量
$allConstants = get_defined_constants();
$coreConstants = array_filter(
$allConstants,
fn(string $key) => str_starts_with($key, "PHP_"),
ARRAY_FILTER_USE_KEY
);
echo "PHP_* constants: " . count($coreConstants) . "\n";扩展库常量示例
不同扩展库定义了自己的常量。以下展示几个常用的:
php
<?php
declare(strict_types=1);
// PDO 常量
echo PDO::ATTR_ERRMODE . "\n"; // 错误报告模式
echo PDO::FETCH_ASSOC . "\n"; // 关联数组提取模式
echo PDO::PARAM_STR . "\n"; // 字符串参数类型
// 排序常量
const SORT_REGULAR = SORT_REGULAR; // 正常比较
const SORT_NUMERIC = SORT_NUMERIC; // 数值比较
const SORT_STRING = SORT_STRING; // 字符串比较
const SORT_ASC = SORT_ASC; // 升序
const SORT_DESC = SORT_DESC; // 降序
// JSON 常量
echo JSON_PRETTY_PRINT . "\n"; // 格式化输出
echo JSON_UNESCAPED_UNICODE . "\n"; // 不转义 Unicode
echo JSON_THROW_ON_ERROR . "\n"; // 错误时抛出异常
// cURL 常量
echo CURLOPT_URL . "\n"; // URL 选项
echo CURLOPT_RETURNTRANSFER . "\n"; // 返回结果选项实战示例
跨版本兼容性检查
php
<?php
declare(strict_types=1);
/**
* PHP 版本兼容性检查工具
*/
class VersionChecker
{
public static function requireMinVersion(int $major, int $minor, int $patch = 0): void
{
$required = $major * 10000 + $minor * 100 + $patch;
if (PHP_VERSION_ID < $required) {
$requiredStr = "{$major}.{$minor}.{$patch}";
throw new RuntimeException(
"Requires PHP >= {$requiredStr}, current: " . PHP_VERSION
);
}
}
public static function isVersion(int $major, int $minor, int $patch = 0): bool
{
$target = $major * 10000 + $minor * 100 + $patch;
return PHP_VERSION_ID >= $target;
}
}
// 使用
VersionChecker::requireMinVersion(8, 1);
if (VersionChecker::isVersion(8, 2)) {
echo "PHP 8.2+ readonly classes available\n";
}平台相关代码处理
php
<?php
declare(strict_types=1);
/**
* 平台检测工具
*/
class PlatformDetector
{
public static function isWindows(): bool
{
return PHP_OS_FAMILY === "Windows";
}
public static function isLinux(): bool
{
return PHP_OS_FAMILY === "Linux";
}
public static function isMac(): bool
{
return PHP_OS_FAMILY === "Darwin";
}
public static function getLineEnding(): string
{
return match (PHP_OS_FAMILY) {
"Windows" => "\r\n",
default => "\n",
};
}
public static function getPathSeparator(): string
{
return match (PHP_OS_FAMILY) {
"Windows" => ";",
default => ":",
};
}
}
// 使用
echo "Line ending: " . bin2hex(PlatformDetector::getLineEnding()) . "\n";
echo "Path separator: " . PlatformDetector::getPathSeparator() . "\n";
echo "Is Windows: " . (PlatformDetector::isWindows() ? "Yes" : "No") . "\n";错误报告配置
php
<?php
declare(strict_types=1);
/**
* 错误报告配置
*/
class ErrorHandler
{
public static function configure(string $environment = "production"): void
{
$settings = match ($environment) {
"development" => [
"error_reporting" => E_ALL,
"display_errors" => "1",
"log_errors" => "1",
],
"testing" => [
"error_reporting" => E_ALL & ~E_NOTICE,
"display_errors" => "0",
"log_errors" => "1",
],
"production" => [
"error_reporting" => E_ALL & ~E_DEPRECATED & ~E_STRICT,
"display_errors" => "0",
"log_errors" => "1",
],
default => [
"error_reporting" => E_ALL & ~E_NOTICE,
"display_errors" => "0",
"log_errors" => "1",
],
};
foreach ($settings as $key => $value) {
ini_set($key, $value);
}
error_reporting((int)ini_get("error_reporting"));
}
}
ErrorHandler::configure("development");
echo "Error reporting: " . ini_get("error_reporting") . "\n";注意事项
1. 扩展库常量的可用性
不是所有预定义常量在所有环境中都可用。检查扩展库常量时,应先验证扩展是否已加载:
php
<?php
declare(strict_types=1);
// 检查扩展是否加载
if (extension_loaded("curl")) {
echo "cURL extension loaded\n";
echo "CURLOPT_URL = " . CURLOPT_URL . "\n";
}
if (extension_loaded("mbstring")) {
echo "mbstring extension loaded\n";
}2. 常量名冲突
用户定义的常量不能与预定义常量同名。使用 define() 重新定义已存在的常量会在 PHP 8.0+ 中产生 Error(在 define() 的第三个参数为 true 时除外)。
3. true/false/null 大小写不敏感
标准布尔常量和 null 不区分大小写,但推荐使用小写形式:
php
<?php
declare(strict_types=1);
// 全部合法,但推荐小写
$flag = true; // 推荐
// $flag = True; // 合法但不推荐
// $flag = TRUE; // 合法但不推荐最佳实践
- 使用 PHP_VERSION_ID 做版本比较:比解析字符串更可靠
- 使用 PHP_EOL 替代硬编码换行符:保证跨平台兼容
- 使用 DIRECTORY_SEPARATOR:避免路径分隔符硬编码
- 检查扩展后再使用其常量:使用
extension_loaded()验证 - 配置合理的错误报告级别:开发环境和生产环境分别配置
- 常量命名避免与预定义常量冲突:使用项目前缀(如
APP_)
下一节
预定义常量是 PHP 内置的固定值,而魔术常量则会根据使用位置动态变化。下一节将学习 __LINE__、__FILE__、__DIR__ 等魔术常量的使用。请阅读 魔术常量。