引用变量的概念:php中的引用意味着用不同的名字访问同一变量内容。
定义方式用&符号
引用变量工作原理:
<?php
$a=range(0,1000);创建0到1000的数组1001个
在内存中体现$a指向这个内存空间
$b=$a;此时不会才分配一块空间,重点 :php有个cow机制 copy and write只要不改变就不会开辟空间
$a=range(0,1000);此时值不变,但是进行了写操作,此时才会开辟一块空间
查看这个体现用php一个函数 memory_get_usage(),用var_dump(memory_get_usage());
查看采用引用方式
$a=range(0,1000);
$b=&$a;//此时永远将a和b连在一起
$a=range(0,1000);
此时就不会变了
php变量采用zend引擎,这里面用zval变量容器
$a=range(0,3);
xdebug_debug_zval('a');
$b=$a;
xdebug_debug_zval('a');
此时refcount=2指向变量的空间,is_ref=0因为没有引用0 false
$a=range(0,3);
此时再用引用
引用还有unset
unset只会取消引用,不会销毁空间
$a=1;
$b = &$a;
unset($b);
echo $a."\n";
还会打印$a的值,只是将b的引用取消掉
对象本身就是引用传值
class Person
{
public $name ="zhangsan";
}
$p1 =new Person;
$p2=$p1;
$p2->name="ass";//注意此时php改的还是改的p1的值,如果想达到之前那样的操作得执行clone
按理说此时无论改谁都会开辟一块空间,但是不会
总结:对象本身就是引用传递就是&
例题:
<?php
$data = ['a','b','c'];
foreach($data as $key => $val)
{
$val=&$data[$key];
}
分析
第一次循环
$k=0;
$v=a;
$v=&$d[0];
第二次循环
$k=1;
$v=b =>d[0]=b;
$v=&$d[1];
- 空白目录
- 安装
- linux下安装nginx
- linux下安装php
- 调试
- windows 安装wamp
- 常用源
- 类型
- Boolean布尔类型
- Integer整型
- Float浮点型
- String字符串
- Array数组
- Object对象
- Resource资源类型
- NULL
- Callback/Callable类型
- 类型转换
- 变量
- 预定义变量
- 常量
- 魔术常量(预定义常量)
- 语法
- 运算符
- 流程控制
- 条件语句
- if
- else
- else if/elseif
- switch
- 循环语句
- while
- do-while
- for
- foreach
- break
- return
- continue
- require
- include
- require_once
- include_once
- 函数
- 内置函数
- 匿名函数
- 自定义函数
- 类与对象
- 属性
- 声明
- public
- protected
- private
- 类常量
- 方法
- 魔术方法
- __construct()
- __destruct()
- __call()
- __callStatic()
- __get()
- __set()
- __isset()
- __unset()
- __sleep()
- __wakeup()
- __toString()
- __invoke()
- __set_state()
- __clone()
- __debugInfo()
- 方法的调用
- ->(对象运算符)
- ::(范围解析操作符)
- 设计模式
- 依赖注入
- call_user_func
- is_callable (
- 创建型模式
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 结构性模式
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
- 行为型模式
- 策略模式
- 模板方法模式
- 观察者模式
- 迭代子模式
- 责任链模式
- 命令模式
- 备忘录模式
- 访问者模式
- 中介者模式
- 解释器模式
- 六大原则
- uml语言
- 反射
- 类型约束
- 调试
- lamp
- lnmp
- composer
- 工作常用
- UML图
- 常见问题