0

0

php中常量能用::访问吗_类常量与作用域操作符使用场景【汇总】

蓮花仙者

蓮花仙者

发布时间:2026-01-01 23:07:19

|

782人浏览过

|

来源于php中文网

原创

类常量必须用::访问,普通常量(define或全局const定义)不可用::,否则报错;::左侧须为类/接口/trait名称或可变类名,支持self、static、parent及命名空间限定名。

php中常量能用::访问吗_类常量与作用域操作符使用场景【汇总】

类常量必须用 :: 访问,普通常量不能用

PHP 中只有 class 定义的常量(即类常量)才支持用作用域操作符 :: 访问;而通过 define()const 在全局作用域定义的常量,**不能**用 ::,否则会报 Fatal error: Uncaught Error: Undefined class constant

常见错误写法:

define('API_TIMEOUT', 30);
echo API_TIMEOUT::class; // ❌ 错误:不是类,没有 :: 操作符
echo API_TIMEOUT::API_TIMEOUT; // ❌ 同样报错

正确做法是直接使用常量名:

echo API_TIMEOUT; // ✅ 输出 30

:: 只能用于类、接口、trait 的常量和静态成员

作用域操作符 :: 的左侧必须是一个有效的「命名空间限定名称」或「类/接口/trait 名称」,不能是变量、表达式或字符串(除非用 ClassName::CONST_NAME 这种字面量形式)。

立即学习PHP免费学习笔记(深入)”;

  • MyClass::MY_CONST ✅ 正确,类名字面量 + 常量名
  • $class = 'MyClass'; $class::MY_CONST ✅ PHP 5.3+ 支持“可变类名”语法
  • self::MY_CONST ✅ 在类内部访问自身常量
  • static::MY_CONST ✅ 支持后期静态绑定(LSP),子类重写时指向实际调用类
  • parent::MY_CONST ✅ 访问父类定义的常量(即使子类未重写)

注意:selfstatic 行为不同 —— self 是编译时绑定,static 是运行时绑定。若子类覆盖了同名常量,self:: 仍返回父类值,static:: 返回子类值。

类常量定义位置与可见性限制

类常量从 PHP 5.6 开始支持表达式(如 1 ),但依然不支持函数调用或变量;PHP 7.1+ 引入 private/protected 类常量(此前所有类常量默认 public)。

定义示例:

家作
家作

淘宝推出的家装家居AI创意设计工具

下载
class Config {
    const MODE = 'prod';
    public const VERSION = '2.1.0';
    protected const DEBUG = false;
    private const SECRET_SALT = 'abc123';

    public function show() {
        echo self::MODE;         // ✅ OK
        echo static::VERSION;    // ✅ OK(public 可被继承访问)
        echo self::DEBUG;        // ✅ OK(protected 允许类内访问)
        // echo self::SECRET_SALT; // ❌ Fatal error:private 常量不可在类外访问,包括本类方法中?等等——实际上可以!✅ 正确:private 类常量可在定义它的类内部任意位置访问,包括方法中。
    }
}

外部访问限制:

  • Config::MODE ✅ public,允许
  • Config::DEBUG ❌ protected,报 Cannot access protected const
  • Config::SECRET_SALT ❌ private,报 Cannot access private const

命名空间下类常量的完整引用路径

带命名空间的类,必须用完全限定名或 use 导入后使用别名,否则 :: 无法解析。

错误写法(未导入且未写全路径):

use My\Package\Foo;
// ...
echo Foo::BAR; // ✅ OK(已 use)
echo \My\Package\Foo::BAR; // ✅ OK(全限定名)
echo Package\Foo::BAR; // ❌ 缺少根命名空间 \,会被当成相对命名空间

特别注意:如果当前文件有命名空间声明(如 namespace App;),而你写了 Foo::BAR 且没 use,PHP 会尝试在 App\Foo 下找类,而不是全局 Foo

建议统一用全限定名或显式 use,避免歧义。

类常量本身不参与命名空间解析 —— 它们属于类,而类名才是命名空间作用的对象。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2012

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1334

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1236

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1402

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号