php面试笔记-php基础知识-变量和引用变量
“ 变量和引用变量。”
面试是从php初学者到php程序员必不可少的一步,很多的面试官更喜欢基础知识扎实的学生。而变量和引用变量是大家比较容易混淆的一点,今天冷月来大家做一个梳理。
首先,变量是什么?
在PHP中变量是用于存储信息的"容器"。我们先申明一个变量:
$a = 1;
在上面的实例中,我们可以注意到,在PHP中声明变量使用“$”美元符而不用声明具体变量的类型。
这是因为PHP 是一门弱类型语言,PHP 会根据变量的值,自动把变量转换为正确的数据类型。而在像C、JAVA等强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。
在了解如何声明PHP变量后,我们在来了解一下PHP引用变量
首先,让我们来看一道经典的面试题:“什么是引用变量?在PHP中,用什么符号来定义应用变量?PHP引用变量的原理是什么?”
1. 什么是引用变量?
在回答这个问题前。我们先来看一段代码:
/**
PHP变量示例
*/
$a = 1; //在内存空间中,开辟一片内存,将1存入进去,然后用$a指向这块内存的地址
$b = $a;//将$a的值赋值给$b
var_dump($a);//输出1
var_dump($b);//输出1
$b = 2; // 将$b所指向地址中的值改为2
var_dump($a);//输入1
var_dump($b);//输出2
PHP中默认支持COW机制(Copy On Write),简单来说就是当执行到b=a 时,内存并不会为b的值发生改变时,内存在才会为b新的值。
那么,如何才能让a和b同时绑定到一个内存空间且不随着赋值而发生改变呢?这就要使用到 & 引用符。现在我们来回答一下“什么是引用变量?”这个问题。
在PHP中引用的意思是:用不同的变量名字访问同一个变量内容,使用&表示。
我们再来看一段代码:
/**
PHP引用变量示例
*/
$a = 1; //在内存空间中,开辟一片内存,将1存入进去,然后用$a指向这块内存的地址
$b = &$a;//因为用了&符,所以将$a指向的地址赋值给$b
var_dump($a);//输出1
var_dump($b);//输出1
$b = 2; // 将$b所指向地址的值改为2
var_dump($a);//因为$a和$b所指向的是同一个地址,所以$a也输出2
var_dump($b);//输出2
我们可以清晰的清晰的看到,在执行 b = &a 后,b同时绑定到一个内存空间且不会随着赋值而发生改变。
2.引用变量的原理?
引用变量的原理其实很简单,就是 b所指向的地址空间相同,且不会因为某一个变量的改变而触发COW机制,所以b所指向的地址空间始终不变,其保存的内容相同,输出结果当然也相同啦。
3.当变量被引用时,unset()函数只会取消引用,不会销毁内存空间
$a = 1;
$b = &$a;
unset($b); //unset 只会取消引用,不会销毁内存空间
var_dump($a); //输出1
定义变量a的引用赋给变量b。虽然销毁的a的引用和内存空间依旧存在。
4. PHP中的对象本身就是引用赋值
class Dog() //定义一个Dog类
{
public $name = "xiaohei";
}
$oneDog = new Dog(); //实例化一个对象oneDog
var_dump($oneDog->name); //输出xiaohei
$twoDog = $oneDog; //把 $oneDog 赋值给 $twoDog
var_dump($twoDog ->name); //输出xiaohei
$twoDog->name = "xiaohuang"; //将name属性改为xiaohuang
var_dump($oneDog->name); //输出xiaohuang
var_dump($twoDog ->name); //输出xiaohuang
因为php中对象本身就是引用赋值。对oneDog的name属性的值会跟着一起改变。
5. 实战演练
代码阅读题:程序运行时,每一次循环结束后变量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']。
好了,看到这儿相信大家对变量和引用变量有了一定的了解,大家可以实际将代码运行一下,会有更深刻的印象哦。
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC