PHP中::只能访问static声明的成员,误用于实例属性或方法会触发Fatal error;非静态成员必须通过对象实例调用;self编译时绑定,static运行时绑定支持后期静态绑定。
:: 访问实例属性或方法PHP 中 :: 是作用域解析操作符,用于访问类的静态成员、常量或父类中被覆盖的方法。但它**不能**用来访问未声明为 static 的属性或方法——否则会触发 Fatal error: Uncaught Error: Access to undeclared static property 或 Call to undefined method。
常见错误写法:
class User {
public $name = 'guest';
public function greet() { return "Hello"; }
}
echo U
ser::$name; // ❌ Fatal error
User::greet(); // ❌ Fatal error
正确做法是:只对明确标记为 static 的成员使用 :::
class User {
public static $role = 'user';
public static function getRole() { return self::$role; }
}
echo User::$role; // ✅
echo User::getRole(); // ✅
$u = new User(); echo $u->name; $u->greet();
$this 和 self/static 时尤其容易出错——$this 在静态上下文中不可用,会报 Fatal error: Using $this when not in object context
self、static 和 parent 在静态调用中的区别
三者都用于静态上下文中的类内引用,但绑定时机和行为不同:
self:编译时绑定,始终指向定义该代码的类(不支持后期静态绑定)static:运行时绑定(LSB),指向实际调用的类(支持继承重写)parent:指向当前类的父类,仅用于显式调用父类静态成员示例对比:
class A {
protected static $msg = 'A';
public static function say() { return self::$msg; } // 绑定 A
public static function tell() { return static::$msg; } // 绑定调用者
}
class B extends A {
protected static $msg = 'B';
}
echo A::say(); // A(self 固定在 A)
echo B::say(); // A(self 仍在 A)
echo A::tell(); // A(static 指向 A)
echo B::tell(); // B(static 指向 B)
多数情况下推荐用 static 替代 self,除非你明确需要“锁定到当前类”;滥用 self 是静态方法无法被子类正确覆盖的常见原因。
看似安全的写法,可能因调用方式意外进入静态上下文:
self::doSomething() 是合法的,但如果该方法本身不是 static,而你又在静态方法中调用了它,就会崩__callStatic)未正确定义时,User::nonExistMethod() 会直接报错而非走兜底逻辑User::find(1))本质是工厂模式,但若自定义了 __callStatic 却没处理所有情况,就容易漏掉链式调用(如 User::where(...)->first())检查要点:
static 声明__callStatic,并覆盖了预期的动态静态方法名$this 或调用 $this->xxx ——这属于硬性语法错误没有语法能阻止开发者写错,但清晰的命名和注释能大幅减少误判:
createFromArray()、getDefaultConfig(),避免和实例方法(如 save()、validate())混淆@static,并说明是否支持 LSB(即是否应使用 static::)self:: 对非静态成员的引用,或未声明 static 却被静态调用的情况最常被忽略的一点:const 默认就是静态的,但 const 只能在类顶层定义,不能在方法内;而 define() 定义的是全局常量,跟类作用域无关——这两者混用也会导致 :: 查找失败。
# php
# phpstorm
# laravel
# access
# 工具
# 区别
# 作用域
# red
# echo
# Static
# Object
# 常量
# define
# 父类
# 子类
# 构造函数
# Error
# const
# 类作用域
# 继承
# using
# Property
# undefined
# 对象
# this
# ide
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
php删除数据怎么软删除_添加is_del字段标记删除【技巧】
Flask 表单数据通过 SMTP 发送邮件的完整实现教程
Windows10系统怎么查看IP地址_Win10网络连接状态详细信息
Windows10如何查看保存的WiFi密码_Win10命令行netsh wlan查询
如何使用Golang操作指针变量_Golang解引用与赋值实践
Python正则表达式实战_模式匹配说明【教程】
Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置
Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺方法【步骤】
如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法
Windows如何使用注册表查找和删除项?(regedit教程)
c++中如何使用虚函数实现多态_c++多态性实现原理
如何在Golang中使用内置函数_Golanglen append make等使用技巧
MAC如何安装Git版本控制工具_MAC开发环境配置与Xcode插件安装【教程】
PHP 中如何在函数内持久修改引用变量所指向的目标
Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看
Windows怎样关闭Edge新标签页广告_Windows关闭Edge新标签页设置【步骤】
为什么Go需要go mod文件_Go go mod文件作用说明
VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】
php本地部署后数据库连接报错_1045accessdenied错误解决方法详解【汇总】
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
Win11怎么关闭透明效果_Windows11个性化颜色关闭透明
Win10电脑C盘红了怎么清理_Windows10系统盘深度瘦身指南
Win10怎样卸载DockerDesktop_Win10卸载DockerDesktop步骤【步骤】
如何使用Golang捕获测试日志_Golang testing日志记录方法
Win11怎样安装剪映专业版_Win11安装剪映教程【步骤】
为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】
如何使用Golang管理模块版本_Golanggo mod tidy与升级方法
如何在 Go 中比较自定义的数组类型(如 [20]byte)
Python解释执行模型_字节码流程说明【指导】
Python与OpenAI接口集成实战_生成式AI应用场景解析
C++如何编写函数模板?(泛型编程入门)
Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】
如何使用正则表达式提取以编号开头、后跟多个注解的完整代码块
mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】
Win11怎么设置开机密码_Windows11账户登录选项PIN码
Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】
如何在 Windows 11 中使用 AlomWare 工具箱
Python数据抓取合法性_合规说明【指导】
php怎么下载安装后设置错误日志_phpini log配置教程【汇总】
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
如何外贸网站设计-能留住客户提升用户体验!
Linux怎么修改用户密码_Linux系统passwd命令使用与权限管理【方法】
Go 中 defer 语句在 goroutine 内部不返回时不会执行
Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
Mac如何整理桌面文件_Mac使用堆栈功能一键整理
如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧
如何在Golang中捕获HTTP服务器错误_GolangHTTP Handler中error处理
2026-01-04
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。