伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

php面试笔记(1)-php基础知识-变量和引用变量

来源:本站原创 浏览:259次 时间:2021-04-29

面试是从php初学者到php程序员必不可少的一步,很多的面试官更喜欢基础知识扎实的学生。而变量和引用变量是大家比较容易混淆的一点,今天冷月来大家做一个梳理。首先,变量是什么?

在PHP中变量是用于存储信息的"容器"。
我们先申明一个变量:

$a = 1;

在上面的实例中,我们可以注意到,在PHP中声明变量使用“$”美元符而不用声明具体变量的类型。

这是因为PHP 是一门弱类型语言,PHP 会根据变量的值,自动把变量转换为正确的数据类型。而在像C、JAVA等强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。

在了解如何声明PHP变量后,我们在来了解一下PHP引用变量

首先,让我们来看一道经典的面试题:“什么是引用变量?在PHP中,用什么符号来定义应用变量?PHP引用变量的原理是什么?”

1. 什么是引用变量?

在回答这个问题前。我们先来看一段代码:

/**PHP变量示例*/$a = 1;  //在内存空间中,开辟一片内存,将1存入进去,然后用$a指向这块内存的地址$b = $a;//将$a的值赋值给$bvar_dump($a);//输出1var_dump($b);//输出1$b = 2; // 将$b所指向地址中的值改为2var_dump($a);//输入1var_dump($b);//输出2

PHP中默认支持COW机制(Copy On Write),简单来说就是当执行到$b = $a 时,内存并不会为 $b 主动新开辟一片空间,只有当 $b 的值发生改变时,内存在才会为 $b 新开辟一片内存空间来存放 $b 新的值。

那么,如何才能让 $a 和 $b 同时绑定到一个内存空间且不随着赋值而发生改变呢?这就要使用到 & 引用符。现在我们来回答一下“什么是引用变量?”这个问题。

在PHP中引用的意思是:用不同的变量名字访问同一个变量内容,使用&表示。

我们在来看一段代码:

/**PHP引用变量示例*/$a = 1;  //在内存空间中,开辟一片内存,将1存入进去,然后用$a指向这块内存的地址$b = &$a;//因为用了&符,所以将$a指向的地址赋值给$bvar_dump($a);//输出1var_dump($b);//输出1$b = 2; // 将$b所指向地址的值改为2var_dump($a);//因为$a和$b所指向的是同一个地址,所以$a也输出2var_dump($b);//输出2

我们可以清晰的清晰的看到,在执行 $b = & $a 后, $a 和 $b 同时绑定到一个内存空间且不会随着赋值而发生改变。

2.引用变量的原理?

引用变量的原理其实很简单,就是 $a 和 $b所指向的地址空间相同,且不会因为某一个变量的改变而触发COW机制,所以 $a 和 $b所指向的地址空间始终不变,其保存的内容相同,输出结果当然也相同啦。

3.当变量被引用时,unset()函数只会取消引用,不会销毁内存空间
$a = 1;$b = &$a;unset($b); //unset 只会取消引用,不会销毁内存空间var_dump($a); //输出1

定义变量 $a ,并将 $a 的引用赋给变量 $b,然后销毁 $b 。虽然销毁的 $b,但是 $a 的引用和内存空间依旧存在。

4. PHP中的对象本身就是引用赋值
class Dog() //定义一个Dog类{public $name = "xiaohei";}$oneDog = new Dog(); //实例化一个对象oneDogvar_dump($oneDog->name); //输出xiaohei$twoDog = $oneDog; //把 $oneDog 赋值给 $twoDog var_dump($twoDog ->name); //输出xiaohei$twoDog->name = "xiaohuang"; //将name属性改为xiaohuangvar_dump($oneDog->name); //输出xiaohuangvar_dump($twoDog ->name); //输出xiaohuang

因为php中对象本身就是引用赋值。对 $twoDog 中的属性 name 进行写操作时,会直接修改指向的内存空间的值,因此变量 $oneDog 的 name 属性的值会跟着一起改变。

5. 实战演练

代码阅读题:
程序运行时,每一次循环结束后变量 $data 的值是什么?请解释。
程序执行完成后,变量 $data 的值是什么?请解释。

$data = ['a','b','c'];foreach($data as $k=>$v){$v = &$data[$k];}

第一次进入循环后,

$k = 0; //开辟一片内存空间,将0存入进去,然后用$k指向这块内存的地址$v = 'a';//开辟一片内存空间,将‘a’存入进去,然后用$v指向这块内存的地址$v = &$data[0];//将$v指向$data[0]的地址空间,也就是$v = $data[0] = ‘a’

第一次循环完后,$data = [‘a’,‘b’,‘c’];

第二次进入循环后,

$k = 1; //$k被赋值1$v = 'b';//$v被赋值'b',由于第一次循环中$v和$data[0]被指向同一内存空间,//所以$data[0]也变成了'b'$v = &$data[1];//将$v指向$data[1]的地址空间,也就是$v = $data[1] = ‘b’

第二次循环完后,$data = [‘b’,‘b’,‘c’];

第三次进入循环后,

$k = 1; //$k被赋值2$v = 'b';//$v被赋值'c',由于第二次循环中$v和$data[1]被指向同一内存空间,//所以$data[1]也变成了'c'$v = &$data[2];//将$v指向$data[2]的地址空间,也就是$v = $data[2] = ‘c’

第三次循环完后,$data = [‘b’,‘c’,‘c’];

所以程序执行完成后,变量 $data 的值是[‘b’,‘c’,‘c’]。

好了,看到这儿相信大家对变量和引用变量有了一定的了解,大家可以实际将代码运行一下,会有更深刻的印象哦

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net