0

0

php中static关键字在函数中有什么作用_php函数static用法【说明】

看不見的法師

看不見的法師

发布时间:2026-02-25 19:53:02

|

391人浏览过

|

来源于php中文网

原创

php函数内static变量仅首次调用时初始化,后续调用保留值;作用域限于函数内,生命周期跨多次调用但不跨请求;不可用函数调用或数组直接初始化,需配合null判断实现单次初始化逻辑。

php中static关键字在函数中有什么作用_php函数static用法【说明】

static变量在函数内只初始化一次

PHP里函数内的static变量不是每次调用都重置,而是首次执行时初始化,之后调用保留上次的值。这和全局变量不同——它作用域仍局限在函数内部,外部不可见,但生命周期跨多次调用。

常见错误现象:static $count = 0;写在函数里,结果发现第二次调用时$cnt没从0开始,反而累加了——这不是bug,是预期行为。

  • 初始化只发生在第一次进入函数时,后续static $x = time();里的time()不会重复执行
  • 不能用表达式直接初始化(如static $arr = [1,2];会报错),PHP 5.6+才支持标量表达式,数组/对象仍需在函数体内赋值
  • 若初始化值是函数调用(如static $db = new PDO(...);),PHP会拒绝,必须拆成声明+判断赋值

如何正确实现“首次加载”逻辑

很多场景想“只做一次初始化”,比如连接数据库、读配置文件、生成唯一ID种子。靠static加条件判断是最轻量的做法,比单例或全局状态更可控。

使用场景:工具函数中缓存计算结果、避免重复加载大文件、防止重复注册钩子。

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

典型写法:

Bardeen AI
Bardeen AI

使用AI自动执行人工任务

下载
function get_config() {
    static $config = null;
    if ($config === null) {
        $config = json_decode(file_get_contents('/path/to/config.json'), true);
    }
    return $config;
}
  • 别写static $config = json_decode(...);——语法错误,PHP不允许函数调用作static默认值
  • === null判断,而不是!$config,避免配置里有0/false等falsy值被误判
  • 注意并发安全:PHP-FPM每个请求是独立进程,static变量天然隔离;但如果是常驻进程(如Swoole),需额外考虑协程/worker间共享问题

static函数与普通函数调用开销差异

函数本身声明为static(即static function foo())和函数内部用static变量完全无关。前者是类中静态方法,后者是函数作用域内的静态变量——名字一样,机制完全不同,混用容易误解。

性能影响几乎可忽略:static变量存储在函数的编译器符号表中,访问速度和局部变量基本一致;没有反射或动态查找开销。

  • 不要因为“static听起来高级”就滥用,能用普通变量解决的,别硬套static
  • static变量无法被unset()销毁(unset($var)对static无效),只能靠脚本结束自动清理
  • 调试时var_dump()能看到static变量的当前值,但IDE断点可能不显示其历史变化,得靠日志辅助观察

容易被忽略的生命周期边界

static变量的“持久性”仅限于单个请求周期。PHP脚本跑完,所有static变量就清空了——它不是跨请求的,也不是跨进程的。很多人误以为它能替代Redis或APCu缓存,结果上线后发现数据根本没留到下次请求。

真实限制:

  • FPM模式下:每个请求都是新进程,static变量彼此完全隔离
  • CLI模式下:一个脚本多次调用同一函数,static才真正体现“跨调用”效果
  • 如果用了OpCache,函数opcode被缓存,但static变量值依然每次请求重新初始化(OpCache不缓存运行时数据)

复杂点在于:当逻辑嵌套深、函数被匿名函数闭包引用、或结合Generator使用时,static变量的行为会变得隐晦——这时候不如明确定义一个类属性来管理状态,可读性和可测性更高。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
swoole为什么能常驻内存
swoole为什么能常驻内存

swoole常驻内存的特性:1. 事件驱动模型减少内存消耗;2. 协程并行执行任务占用更少内存;3. 协程池预分配协程消除创建开销;4. 静态变量保留状态减少内存分配;5. 共享内存跨协程共享数据降低内存开销。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.04.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

886

2024.03.01

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2023.11.20

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

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

1640

2023.10.23

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

87

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

103

2025.09.18

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

147

2025.07.29

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

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

精品课程

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

共137课时 | 12.4万人学习

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

共6课时 | 11.3万人学习

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

共13课时 | 0.9万人学习

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

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