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 】
相关推荐:
php打包exe后无法写入文件_权限问题解决方法【教程】
Python异步网络编程_aiohttp说明【指导】
Win11如何开启系统更新 Win11开启系统更新方法【步骤】
如何使用Golang反射创建map对象_动态生成键值映射
Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】
如何在 Go 中正确反序列化多个同级 XML 元素(而非单个根节点)
Linux如何挂载新硬盘_Linux磁盘分区格式化与开机自动挂载【指南】
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】
Win10怎样清理C盘Steam游戏缓存_Win10清理Steam游戏缓存步骤【步骤】
Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
php报错怎么查看_定位PHP致命错误与警告的方法【教程】
Win10如何备份驱动程序_Win10驱动备份步骤【攻略】
Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】
Mac如何与安卓手机传文件_Mac和Android设备互通【必备工具】
Windows服务持续崩溃怎样修复_系统服务保护机制解析
Python解释执行模型_字节码流程说明【指导】
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
Django 测试数据库表缺失与字段未创建问题的完整解决方案
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
如何在 Django 中修改用户密码后保持会话不丢失
如何在 Go 同包不同文件中正确引用结构体
VSC怎样用终端运行PHP_命令行执行脚本的步骤【教程】
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】
Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
c++输入输出流 c++ cin与cout格式化输出【方法】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Win11如何关闭游戏模式 Win11禁用Xbox Game Bar录制【优化】
c++如何判断文件是否存在_c++ filesystem库用法
微信JSAPI支付回调PHP怎么接收_处理JSAPI异步通知数据方法【指南】
Windows11怎么用“记事本”自动换行与编码 Windows11记事本启用自动换行选择UTF-8编码避免乱码兼容多语言【教程】
如何使用Golang sort排序切片_Golang sort排序方法示例
如何用正则表达式精确匹配最多含一个换行符的起止片段
如何使用Golang读取日志文件_Golang bufio Scanner日志处理示例
VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】
如何诊断并终止卡死的 multiprocessing 子进程
Win11怎么设置组合键快捷方式_Windows11自定义快捷键操作
Python项目回滚策略_发布安全说明【指导】
短链接怎么自定义还原php_修改解码规则适配需求【汇总】
PHP的FastAdmin架构适合二次开发吗_特点分析【介绍】
php嵌入式需要什么环境_搭建php+linux嵌入式开发环境【详解】
Win10系统映像怎么恢复 Win10使用系统映像还原电脑【指南】
2026-01-04
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。