您的位置:首页 > 编程语言 > PHP开发

php变量学习总结

2014-05-26 14:51 585 查看
一 php的变量

首先我们声明一个变量,¥$var=1;

php内部是使用zval来表示变量的,对于上面的脚本,我们声明的变量的名字是var,php内部有一个机制来实现变量名与zval的映射。

在php中所有的变量都会存在一个数组中,更准确的说时都存在一个hash table中。

但用户创建一个变量的时候,php会为这个变量分配一个zval,填入相应的变量的值,然后把zval的指针和变量名一并填入一个数组中,当你需要使用这个变量的时候,php会查找数组获取对应的zval,简单说一句,php为什么是弱类型的语言就是因为php的每一种数据类型在php看来都是zval,以后有机会详细介绍zval,zval是一个结构体,存贮变量值的地方是一个联合体。

二 php变量的作用域

我们都知道,变量按照作用范围来分可以分为全局变量和局部变量,php是怎么区分全局变量和局部变量的呢?

比如<?php

$var='sam';

function test($a){

$b=$a;

echo $b;

}

test($var);

?>

在这段脚本中,我们都知道$var是一个全局变量,$a是一个形参,$b是一个局部变量,作用范围就是test()内,在php中有一个全局符号表,保存了顶层作用域的变量,所谓顶层作用域就是不属于任何函数或者对象内的变量。每当调用一次函数或者对象内的方法的时候,php都会为创建一个活动符号表,所有函数内的变量都会存储在这个活动符号表内。比如在这段脚本中,$var就在全局符号表,与它对应的一个zval指针保存了一个字符串sam,而$b则是保存在函数test()的活动符号表中,$a也会保存在test()的活动符号表中,只不过与它对应的zval的指针回事$var的引用。

三 php变量的赋值与引用

以离子说明这个问题:

$a=1;

$b=$a;

首先说明的是$a和$b指向的是同一个zval,对于上面的赋值语句,php是不会为$b分配一个zval的,php所做的只是在符号表里面新加入名字b同时让它的指针指向a对应的zval指针,那么在什么时候会新开辟内存呢,在出现不可调和的矛盾是比如这时候$b=2;这个时候就会新开辟内存,其实这个时候包含了一个变量的分离操作,也就是在修改$b 的时候,php会首先检查这个变量的refcount,(注:refcount是这个变量被引用的次数,这是由zval的结构决定的),如果refcount大于1这个时候就会执行分离操作,这时php会分离出一个新的zval给变量b,把原来的refcount的值减一,并修改符号表。这个机制就是所谓的copy
on write。

$a=1;

$b=&$a;

最开始的时候,$a对应的zval的引用也就是refcount的值为1,但是在执行$b=&$a;的时候,$a和$b对应的zval的refcount的值都会被修改为0,二is_ref维设置为1,这时候修改任何一个变量的值都不会执行分离操纵,只是修改对应的zval中的值,也就是php在修改变量的时候会判断refcount和is_ref的值,如果refcount大于1。那么就执行分离操作,如果is_ref的值为1不会执行分离操作,所谓的change on
write原则。这也正是弱类型语言的高明之处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息