内存原理(形象理解)
1、内存结构
1、栈区
保存的是变量名(术语称之为引用)
特点:对于CPU来说,读写速度是最快的
2、数据段
存储的是简单数据,例如:整形、浮点型、布尔值等
3、堆区
存储复杂的数据,数组、对象等
4、代码段
存储的是源代码对应的机器指令(人能看懂但计算机看不懂,必须经过转换)
5、输出缓存
只要遇到输出指令,例如echo、print、print_r、var_dump,这些指令都会将所要输出的数据放在输出缓存中。
2、php的执行过程
1、编译阶段
进行语法检查、词法检查、代码优化。
编译通过之后将源代码
编译错误的提示信息如下:
2、执行阶段
如果编译通过后,会将源代码对应的机器指令,保存在代码段,再开始执行代码段中的机器指令
3、php嵌入到HTML
当php功能模块在处理一个php文件时,它只关心php代码(使用php标签包含的代码)。对于非php标签,它会原样输出。
js、html、CSS对于php来说都是字符串
举例:
<?php echo '<script>alart(1)</script>'; ?>
解读完后为:
<script>alart(1)</script>
运行结果:弹出窗口1
4、php中变量的传值方式
1、赋值传值
使用一个变量a为另一个变量b赋值时,传递的是变量a的值
2、引用传值
使用一个变量a为另一个变量b赋值时,传递的是变量a的地址
注意:js中不允许人为的更改传值方式,但是php中可以使用地址符'&',来将赋值传值更改为引用传值。
举例:
<?php $v1=10; $v2=&$v1; $v2=20; echo $v2; ?>
执行$v2=&$v1;在栈区开辟一个空间存储变量$v2,由于在赋值时发现$v1前有个&符号,此时会将$v1的内存物理地址赋值给栈区中的$v2,即两个变量共用一个物理地址,改动任意一个变量的值,另一个也跟着改变。
常量
1、概念
常量是一种特殊的变量,也是用于存储数据。常量一旦定义就不允许修改其值,常量本身也不允许删除。
2、定义
常量一旦定义就不允许修改
常量的值只能是基本数据类型(标量数据类型)
常量默认区分大小写,一般常量在命名时,我们会使用全大写的形式
语法:
1、define(‘常量名,值’);
2、const 常量名=值;
3、define vs const
define语法可以再分支结构中定义常量,const不行
define定义的常量可以自定义是否区分大小写
define第三个参数设置为true,则不区分大小写
define('PI',3.141,true); echo pI;
运行结果:
3、常量的判断及获取所有的常量
1、判断
defined();
define('PI',3.141); $result=defined('PI'); var_dump($result);
运行结果:
补充:var_dump() :
var_dump() 函数用于输出变量的相关信息。
var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
2、获取所有常量
get_defined_constants();
$result=get_defined_constants();
echo'<pre>';
print_r($result);
运行结果:
4、魔术常量
php中又定义了一组魔术常量
_ _ FILE _ _ :用于获取当前文件完整路径及文件名
_ _ DIR _ _ :用于获取当前文件的路径
_ _ LINE _ _ :用于获取当前行号
_ _ FUNCTION_ _ :用于获取当前当前函数的函数名
_ _ METHOD_ _ :用于获取当前方法的方法名
_ _ CLASS_ _ :用于获取当前类的类名
_ _ NAMEPACE_ _ :用于获取当前空间的空间名