静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】
技术百科
看不見的法師
发布时间:2026-01-01
浏览: 次 会。静态属性属于类本身,所有实例共享同一内存地址,修改后其他实例立即可见;不可用$this访问,需用类名或self/static;::支持后期静态绑定,self::编译时绑定;多进程下无锁易竞态;Web中生命周期仅为单请求,跨请求需用Redis等外部存储。
会。用 :: 修改类的静态属性,所有实例共享该值,因为静态属性属于类本身,而非某个对象实例。
静态属性在内存中只有一份副本
PHP 中 static 属性不随 new 实例化而复制,它被分配在类的符号表中,所有实例通过类名或 self/static 访问的都是同一块内存地址。
常见错误现象:修改一个实例通过 self::$prop 赋值后,另一个新创建的实例读取该属性发现值已变——这不是“污染”,而是设计如此。
- 使用场景:计数器、配置缓存、连接池单例标识等需要跨实例同步的状态
- 注意:不能用
$this->访问静态属性,否则报Access to undeclared static property - 若需每个实例隔离状态,请改用普通属性 + 构造函数初始化
:: 和 self:: 的行为差异
表面上都用于访问静态成员,但绑定时机不同::: 是运行时解析(支持后期静态绑定),self:: 是编译时绑定(永远指向定义它的类)。
class A {
public static $name = 'A';
}
class B extends A {
public static function getName() {
return self::$name; // 永远返回 'A'
// return static::$name; // 若取消注释,则返回子类重写的值(如 B 重写了 $name)
}
}所以用 A::$name = 'changed' 或 B::$name = 'changed' 都会直接改写对应类声明的静态属性;而 
self:: 在 A 里写死,就不可能访问到 B 的同名静态属性,哪怕 B 继承了它。
修改静态属性前必须确认是否允许多处写入
没有内置锁机制,多线程(如 PHP-FPM 多进程)下并发修改会导致竞态。例如:
- 用
static::$counter++做请求计数,可能漏计(两个进程同时读 100,各自加 1 再写回 101) - Web 环境中静态属性生命周期=单个请求周期,FPM 下每次请求都会重置,不要误以为能跨请求持久化
- CLI 模式下若长时运行(如守护进程),静态属性才真正“长期存在”,此时更需注意初始化和清理
如果需要跨请求共享且可写,应改用 Redis、APCu 或数据库,而不是依赖静态属性。
最易忽略的一点:static 属性的初始化表达式只能是常量或字面量,不能是函数调用或变量——PHP 解析期就要求确定值,这点和 Java/C# 不同。
# redis
# java
# c#
# access
# red
# 无锁
# 作用域
# php
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何使用Golang反射将map转换为struct
- Win11系统更新后黑屏怎么办 Win11更新黑屏
- Python邮件系统自动化教程_批量发送解析与模板
- Windows怎样关闭开始菜单推荐广告_Windo
- Mac上的iMovie如何剪辑视频?(新手入门教程
- Win10系统字体模糊怎么办_Windows10高
- Win11怎么设置屏保_Windows 11屏幕保
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Python与OpenAI接口集成实战_生成式AI
- Win11怎么更改账户头像_Windows 11自
- php订单日志怎么记录评价_php记录订单评价日志
- Win11怎么关闭系统声音_Win11系统提示音静
- php485返回空数组怎么回事_php485数据接
- php8.4如何调用com组件_php8.4win
- Win11怎么制作U盘启动盘_Win11原版系统安
- Go 中实现 Python urllib.quot
- Win11如何添加/删除输入法 Win11切换中英
- 如何用列表一次性对 DataFrame 的指定列应
- Python字符串操作教程_切片拼接与格式化详解
- Win11怎么更改管理员名字 Win11修改账户名
- Mac的访达(Finder)怎么用_Mac文件管理
- 如何解决Windows字体显示模糊的问题?(Cle
- windows 10应用商店区域怎么改_windo
- c++如何实现一个高性能的环形队列(Ring Bu
- 如何在Golang中实现邮件发送功能_Golang
- XSLT怎么生成动态的HTML属性名和标签名
- Win11如何开启telnet服务 Win11启用
- c# 如何深拷贝和浅拷贝
- PythonPandas数据分析项目教程_时间序列
- php删除数据怎么清空表_truncate与del
- 如何在 Django 中安全修改用户密码而不使会话
- SAX解析器是什么,它与DOM在处理大型XML文件
- 如何使用Golang实现聊天室消息存档_存储聊天记
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Win10如何更改用户账户控制_Windows10
- Win11怎么关闭VBS安全性_Windows11
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Win11怎么设置声音输出设备_Windows11
- c++如何判断文件是否存在_c++ filesys
- 如何使用Golang处理静态文件缓存_提高页面加载
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11怎么关闭系统透明度_Windows11个
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- C++如何使用std::transform批量处理
- php高频调试功能有哪些_php常用调试函数与工具
- Win11如何暂停系统更新 Win11暂停更新最长
- php485在php5.6下能用吗_php485旧
- Windows电脑如何进入安全模式?(多种按键方法
- Drupal 中 HTML 链接被双重转义导致渲染
- Mac如何创建和管理多个桌面空间_Mac高效多任务

QQ客服