php双冒号怎么用_php中静态成员调用与作用域操作符用法【方法】
发布时间 - 2025-12-31 00:00:00 点击率:次PHP中双冒号::是作用域解析操作符,用于访问类常量、静态属性和方法,以及实现后期静态绑定;必须用::而非->访问静态成员和常量,且self::编译时绑定、static::运行时绑定。
PHP 中的双冒号 :: 是作用域解析操作符(Scope Resolution Operator),不是“调用静态方法的语法糖”,而是用于明确指定在哪个类/作用域中访问成员——它既可用于静态成员,也可用于非静态常量、抽象方法占位、甚至后期静态绑定(static::)。
什么时候必须用 :: 而不能用 ->
当你要访问的是 const、static 属性或 static 方法时,对象实例无法使用 -> 访问这些成员。哪怕该静态方法内部用了 $this,也不能通过对象调用(PHP 会报 Fatal error: Using $this when not in object context)。
-
self::指向定义当前方法的那个类(编译时绑定) -
static::指向实际调用时的类(运行时绑定,支持后期静态绑定 LSB) -
parent::用于子类中调用父类被重写的静态成员 - 直接写
ClassName::是最明确的方式,不受继承上下文影响
:: 访问常量和静态属性的常见写法
类常量必须用 :: 访问,且不加 $;静态属性要加 $,但依然只能用 :: 读写(除非在类内部用 self::$prop)。
class Config {
const API_TIMEOUT = 30;
public static $retry_limit = 3;
}
echo Config::API_TIMEOUT; // ✅ 正确
echo Config::$retry_limit; // ✅ 正确
// echo Config->API_TIMEOUT; // ❌ 语法错误
// echo $config->retry_limit; // ❌
静态属性不能用 ->
为什么 self:: 和 static:: 行为不同
这是最容易出 bug 的地方:如果你在父类里写 self::METHOD(),子类继承后调用,执行的仍是父类里的方法;而用 static::METHOD(),则会调用子类重写的版本。
class A {
public static function who() { return __CLASS__; }
public static function test() { return self::who(); } // 绑定到 A
public static function testLate() { return static::who(); } // 绑定到调用者
}
class B extends A {
public static function who() { return __CLASS__; }
}
echo A::test(); // A
echo A::testLate(); // A
echo B::test(); // A ← 容易误以为是 B
echo B::testLate(); // B ← 这才是你想要的多态效果
不能在普通函数或闭包里直接用 :: 调用类成员
:: 只能在类定义内部、或全局作用域中以 ClassName::xxx 形式使用。你不能在一个普通函数里写 self::xxx(因为没有类上下文),也不能在匿名函数里直接用 $this->method() 去触发静态调用逻辑——那会报错或行为异常。
- 在闭包中需要访问静态成员?显式传入类名字符串,再用
call_user_func([ClassName::class, 'method']) - 想动态调用?用
forward_static_call_array()或反射ReflectionMethod - 误把
new ClassName()::method()当成链式调用?PHP 不支持,会解析成(new ClassName())::method()并报错
真正要注意的不是“怎么写双冒号”,而是它背后的作用域绑定时机——self 看声明位置,static 看调用位置,ClassName 看你写死的是谁。多数静态工具类用 ClassName:: 最安全;涉及继承扩展时,static:: 才是让代码可覆盖的关键。
# php
# 工具
# 作用域
# 为什么
# Static
# Object
# 常量
# 父类
# 子类
# Error
# const
# 字符串
# 继承
# using
# class
# operator
# 闭包
# 对象
# this
# bug
# 绑定
# 能在
# 后期
# 重写
# 链式
# 报错
# 会报
# 的是
# 这是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用美橙互联一键搭建多站合一网站?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
郑州企业网站制作公司,郑州招聘网站有哪些?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Android自定义控件实现温度旋转按钮效果
Laravel集合Collection怎么用_Laravel集合常用函数详解
zabbix利用python脚本发送报警邮件的方法
如何用免费手机建站系统零基础打造专业网站?
黑客如何通过漏洞一步步攻陷网站服务器?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
高防服务器如何保障网站安全无虞?
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
🚀拖拽式CMS建站能否实现高效与个性化并存?
想要更高端的建设网站,这些原则一定要坚持!
如何用IIS7快速搭建并优化网站站点?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
nginx修改上传文件大小限制的方法
JavaScript如何实现路由_前端路由原理是什么
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何快速搭建虚拟主机网站?新手必看指南
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
南京网站制作费用,南京远驱官方网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Linux网络带宽限制_tc配置实践解析【教程】
jQuery中的100个技巧汇总
制作电商网页,电商供应链怎么做?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
使用Dockerfile构建java web环境
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel如何处理和验证JSON类型的数据库字段
如何做网站制作流程,*游戏网站怎么搭建?
Python制作简易注册登录系统
公司网站制作价格怎么算,公司办个官网需要多少钱?
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何在橙子建站中快速调整背景颜色?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
常州企业网站制作公司,全国继续教育网怎么登录?
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel如何使用Gate和Policy进行授权?(权限控制)
WordPress 子目录安装中正确处理脚本路径的完整指南
jquery插件bootstrapValidator表单验证详解
,在苏州找工作,上哪个网站比较好?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何正确下载安装西数主机建站助手?
如何安全更换建站之星模板并保留数据?


静态属性不能用 ->