引用變量的概念: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圖
- 常見問題