开发者学堂课程【PHP 基础入门课程(下):函数内存分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/710/detail/12624
函数内存分析
内容介绍:
一、目标
二、概念
三、具体步骤
四、示例
五、结果分析
六、小结
一、目标
了解函数在内存中的运行原理。
二、概念
(1)函数运行的前提: 当前函数已经在内存中存在。运行就是调运,要把它加载在内存中才能使用。
(2)函数不会自动运行。
(3)函数运行是在战栈区开辟内存运行。和内存有相应的关系。
(4)函数运行结束会自动释放所占用内存。使用结束系统会把当前加载的内存运行进行释放,就是释放栈区里的内存。
三、具体步骤:
1、脚本编译: 将代码加载到内存中。
虽然是一种解释性语言,但也要进行一种编译,即时编译。将代码加载到内存中时,也要进行一种语法的解析,语法的检查。例如是否规范,是否写错
逻辑如下:
(1)代码被读取。要读到内存,这是因为代码写在文件中,文件不能执行,所以要读到内存中。
(2)代码被编译: 语法出错会报错。结果是将别以后的代码装在代码段,专门放代码的内存。
(3)所有代码被加载到内存中。
2、代码执行
(1)代码顺序逐行执行。顺序执行三大结构。
(2)函数结构不会被执行(跳过)。认为函数结构不这么用。
3、函数执行 (函数名+())
(1)在内存中寻找函数名对应的函数是否存在
不存在: 报错
存在: 继续
编译时所有的函数代码都存在,所以继续进行。
如果找不到就会报错。
(2)在栈区开辟内存加载函数
参数处理
函数体执行
(3)函数执行结束
占用内存释放(栈区内存)这里不能释放代码段。
回到函数调用处
4、脚本执行结束: 释放所有内存
(包括存放代码的代码段)即占用内存被全部释放。
四、示例
利用此原理进行代码的解析。
#先调用函数
he11o();
wor1d():
#后定义函数
同变 function hello(){
echo'hello';
系统看到此会认为是函数调用,
#先调用函数
he11o();
wor1d():
这段代码开始从上至下进行运行。系统提示运行错误,提示没有此函数。
接下来定义函数,进行输出,
#后定义函数
function hello(){
echo'hello';
此时 hello 代表函数的名字,运行代码,刷新可以看到输出 hello,
出错的问题在 world 函数。此时分析问题所在,首先将代码读入到内存,请求时把整个脚本的代码加载至内存,执行代码。首先,执行 hello,找到 function 进行执行,最后回到调用处,并且释放掉内存。执行第二行 world,在内存中找不到对应的函数,因为对应的脚本中没有此函数,此时报错,产生结果。所以 hello 被正常输出,而 World 报错,最后执行至最后一行。理论上报错后不再进行,假设没有进行报错,剩下的代码也不会执行,因为这是一种结构,系统会直接跳过,直至结束,同时释放所有占用的内存。而重新换一个脚本也不会被调用,因为脚本中没有此函数。
五、结果分析
1、代码编译: 函数 hello 被加载到内存
2、执行代码
Hello()
执行: 发现内存中有: 执行,输出 hello
World()
执行: 发现内存中没有: 报错
六、小结
1、函数运行的前提是内存中已经存在该函数。将函数定义好,将对应的文件加载至内存才能运行,调用。
2,函数运行与定义的顺序没有先后顺序(建议先定义,后运行)
3、函数的执行是在栈区运行(效率高)比较少。
4、函数运行完就会释放自己所占用的内存。如果在内存中定义了一些变量,变量放入栈内,在函数运行完之后,变量也会被释放。
5、Php 脚本运行结束会释放所有内存。无论数据还是代码,都会被释放。保证 php 脚本占用内存少。