静态变量|学习笔记

简介: 快速学习静态变量

开发者学堂课程【PHP 基础入门课程(下)静态变量】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/710/detail/12636


静态变量


内容介绍:

一、静态变量概念

二、示例

三、流程图解析

四、小结


一、静态变量概念

1、静态变量:在函数内部定义的,可以在函数多次调用时共用的局部变量。实现数据的跨函数使用。

2、说明如下:

(1)静态变量使用 static 关键字修饰。

(2)静态变量是在函数内部定义的局部变量。

(3)静态变量在函数加载(编译)时初始化(只初始化一次)。

(4)静态变量可以在同一个函数多次调用时共享数据的变化。(静态变量是存储在函数里面的)

3、步骤:

(1)确定函数内的局部变量是否需要在函数多次调用时共享

不需要:普通局部变量即可

需要:使用 static 修饰成静态变量

(2)在函数内部对静态变量进行运算


二、示例

当函数被调用时输出函数是第几次调用。(如果用一个变量来记,当跨脚本或同时运行多个脚本时就不方便了,所以用内部来记)

function display(){

#普通局部变量:每次调用函数都会执行初始化

$count1 = 1;

#静态变量:函数加载时初始化被执行(调用时不执行)

static $count2 = 1;

#参与其他运行的代码都是在调用时执行

echo $count1++,$count2++;

}

display();       #输出1,1

display();       #输出1,2

<?php

function display(){

#记录函数被调用了多少次

$count1 = 0;

echo ++$count1,‘<br/>’;

}

display();      #调用了一次

display();       #还是1

运行结果:

image.png

因为当函数第一次调用的时候把这段代码用来执行,$count1 = 0,再加$count1 = 1,然后输出,输出完了后要销毁局部变量。当第一次调用完了执行第二次的时候前面都已经没了,再来一次会初始化,因此每次都是1。但可以

function display(){

#记录函数被调用了多少次

$count1 = 0;

#静态变量

static $count2=0;  #可以声明可以赋值   该行代码只会在函数加载到内存的时候执行:以后函数调用时系统会跳过

cho $count1++,$count2++,‘<br/>’;

}

display();       #输出1,1

display();        #输出1,2

函数在编译的时候代码检测到 static, 会对它进行初始化,函数自己保存变量等于0,而且该行代码只会在函数加载到内存的时候执行:以后函数调用时系统会跳过。


三、流程图解析

第一步函数要加载到内存,加载到内存就是要进行编译,此时系统要判定其中是否有静态变量,如果没有,直接加载到内存。如果有,系统会初始化静态变量。此时值保存在结构里面。接下来到内存之后,访问函数,判断是否有 C 修饰的变量,如果没有就一行行往下执行。如果有就跳过。再往下执行会发现如果有操作静态变量,意味着前面操作的都会保存到函数里面,第二次操作的又存在函数里面,调用完后整个的都会销毁,最后静态变量能在函数第一次调用的时候,把数据存着,第二次可用,第二次调用的时候把数据存着第三次的时候可用。

image.png


四、小结

1、静态变量是在函数内部定义的使用 static 修饰的局部变量。

(1)static 修饰的变量是在函数编译(加载)时被初始化

(2)static 修饰的变量行在函数调用时会跳过执行

(3)静态变量是保存在函数里面:所以每次调用时修改的值都可以被下次调用使用

2、静态变量的作用

(1)让函数在多次调用时能够共享内部数据变化

(2)普通局部变量每次调用都会初始化

3、静态变量的使用场景

(1)数据需要函数多次调用共享数据

(2)在函数使用递归存储数据的时候

相关文章
|
存储 设计模式 缓存
Java 中的 static:静态变量、静态方法,一切都在掌握中
Java 中的 static:静态变量、静态方法,一切都在掌握中
1965 0
|
监控 供应链 数据安全/隐私保护
ERP系统中的库存周转率优化与管理解析
【7月更文挑战第25天】 ERP系统中的库存周转率优化与管理解析
728 0
|
C++ 开发者
C++一分钟之-概念(concepts):C++20的类型约束
【7月更文挑战第6天】C++20引入了Concepts,提升模板编程的精确性和可读性。概念允许设定模板参数的编译时约束。常见问题包括过度约束、不完整约束及重载决议复杂性。要避免这些问题,需适度约束、全面覆盖约束条件并理解重载决议。示例展示了如何定义和使用`Incrementable`概念约束函数模板。概念是C++模板编程的强大力量,但也需谨慎使用以优化效率和代码质量。
332 0
|
Serverless 对象存储
用阿里云内容安全处理OSS的违禁图片
原文档,https://help.aliyun.com/document_detail/2400149.html 基于官方的文档做的一些拓展
938 1
|
SQL 数据处理 数据库
第3章 关系数据库标准语言SQL——3.2 学生-课程数据库
第3章 关系数据库标准语言SQL——3.2 学生-课程数据库
|
开发者
段落标签与水平线标|学习笔记
快速学习段落标签与水平线标
261 0
段落标签与水平线标|学习笔记
|
消息中间件 JSON SpringCloudAlibaba
贼好用,冰河再次升级了这款开源的精准定时任务和延时队列框架!!
在实际工作中,很多小伙伴在开发定时任务时,会采取定时扫描数据表的方式实现。然而,这种方式存在着重大的缺陷:如果数据量大的话,频繁的扫描数据表会对数据库造成巨大的压力;难以支撑大规模的分布式定时任务;难以支持精准的定时任务;大量浪费CPU的资源;扫描的数据大部分是不需要执行的任务。那么,既然定时扫描数据表存在这么多的弊端,那么,有没有一种方式来解决这些问题呢?今天,冰河就带着他的开源项目mykit-delay来了!!开源地址:https://github.com/sunshinelyz/mykit-delay 和 https://gitee.com/binghe001/mykit-delay
370 0
贼好用,冰河再次升级了这款开源的精准定时任务和延时队列框架!!
|
C++
C++异步编程最佳实践
## Mapreduce问题 多个数据,进行同类型计算,最后汇总结果,怎样用C++解锁此类问题? >这个最简单了,单线程循环处理每份数据好了。 >这有何难,创建一块地方,针对每份数据创建个线程执行计算,将结果写入先前创建的数据的对应地方,等各线程结束,完活。 上面的说法都对,只是不够好。 对于单线程处理,在这个多核时代,未免大马拉小车,有点浪费CPU。当问题规模变大,你准备花多
6529 0