PHP 引用
php的引用與c++引用有點差距.比如返回引用時不用考慮區域性變數的作用域,外部接收函式返回時需要顯示的加上&號,以表示是引用返回而不是拷貝返回.這就像要兩頭商量一樣.
php的引用在定義後,甚至不用定義,在後續使用時可以隨時修改引用的目標.而c++的引用變數在初始化後就不能修改為別的引用了.
引用變數:
$a = 1;
$b = 2;
$c = 3;
$a = &$b;
echo $a.' '.$b.'<br/>';
$a = &$c;
echo $a.' '.$b.'<br/>';
官方說明說通過&號,$a指向了$b同一個地方.但我覺得c++引用的概念, $a是$b的別名也講的通.操作$a和操作$b一樣.互相都體現變化.
如上面說的,php引用可以隨時更換目標.
引用引數:
在函式的引數前面加上&號表示該引數會以引用方式傳入.函式內部對引數修改會影響到實參.
$arr = array(1,2,3,4,5);
function fun(&$p)
{
if(is_array($p))
{
foreach($p as &$v)
{
++$v;
}
var_dump($p);
echo '<br/><br/>';
}
}
fun($arr);
var_dump($arr);
在呼叫時不用fun(&$arr)
來表示引用傳入,最新的php版本會對此報錯.
程式碼輸最後dump的輸出顯示$arr被函式內部修改.
甚至不需要預先定義變數:
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass; // new已經能給編譯器表示是引用返回,所以舊的$c =& new StdClass會報錯.
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
如果對一個未定義的變數進行引用賦值、引用引數傳遞或引用返回,則會自動建立該變數.
global總是那麼難纏:
在一個函式內將一個全域性變數申明為global,之後對他進行引用指向後的操作僅在函式內有效.
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function
echo 'false '.$var2.'<br/>';
} else {
$GLOBALS["var2"] =& $var1; // visible also in global context
echo 'true '.$GLOBALS["var2"].'<br/>';
}
}
global_references(false);
echo '$var2 = '.$var2.'<br/>';
global_references(true);
echo '$var2 = '.$var2.'<br/>';
$var2 = 1;
echo '$var1 = '.$var1.'<br/>';
輸出:
false Example variable
$var2 =
true Example variable
$var2 = Example variable
$var1 = 1
雖然有$GLOBALS['var2']
的方法解決.但是多彆扭啊. 直接在引數裡傳個引用引數就得了.
foreach的as:
也可以是這樣引用來修改陣列value
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// do something
}
echo $ref; // 3 - last element of the iterated array
和最上面的foreach其實是一樣啦.
引用返回:
函式名前面加上 & 表示返回引用.
function &funref(& $p)
{
$p = 'funref'.' hei<br/>';
return $p;
}
$refrst = &funref($ref);
echo '<br/> '.$ref.' '.$refrst.'<br/>';
$ref = 'abc';
echo '<br/> '.$ref.' '.$refrst.'<br/>';
變數$ref為自動建立.在函式內被修改值後返回引用,在$refrst接收引用時需要在賦值表示式加上&表示為引用方式接收返回.
如果不加的話,那$refrst為函式返回值的一個拷貝.可以通過後面的$ref修改來發現,$refrst的值不隨之改變.
引用的引用實際還是最初的物件的引用:
function refsref()
{
$var = 'string';
$ref =& $var;
$refref =& $ref;
echo $ref.' '.$refref.'<br/>';
$ref = 'strinttt';
echo $ref.' '.$refref.'<br/>';
unset($ref);
echo ' '.$refref.'<br/>';
}
refsref();
同發於我的部落格:EPICS.CN
相關文章
- PHP引用的&理解PHP
- 3. PHP 引用解惑PHP
- PHP 類多次引用報錯PHP
- PHP物件導向之&引用PHP物件
- PHP5的OOP–$this引用PHPOOP
- 引用-PHP手冊筆記PHP筆記
- PHP中物件的引用傳遞PHP物件
- PHP引用的一個面試題PHP面試題
- 一篇搞懂 PHP 的引用PHP
- PHP 引用詳解 - 踩坑與妙用PHP
- php中物件是引用型別嗎?PHP物件型別
- PHP取地址符(引用符)&詳解PHP
- php傳引用和全域性變數PHP變數
- PHP的引用計數是什麼意思?PHP
- PHP的垃圾回收機制-引用計數PHP
- 深入理解PHP中賦值與引用PHP賦值
- PHP物件的引用及物件優化策略PHP物件優化
- php函式引用傳遞引數的方法PHP函式
- php的變數引用與銷燬機制PHP變數
- php正則逆向引用與子模式分析PHP模式
- php 傳值與傳引用的理解(通俗易懂)PHP
- Java四種引用包括強引用,軟引用,弱引用,虛引用。Java
- PHP的引用操作符& 的使用及注意事項PHP
- Java的強引用、軟引用、弱引用、虛引用Java
- 【JVM】如何理解強引用、軟引用、弱引用、虛引用?JVM
- java的強引用、軟引用、弱引用、幻象引用,引用佇列總結Java佇列
- Java四大引用詳解:強引用、軟引用、弱引用、虛引用Java
- Java中的四種引用方式(強引用、軟引用、弱引用、虛引用)Java
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- PHP 物件導向 (四)類物件賦值為引用傳遞PHP物件賦值
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- 強引用、軟引用、弱引用、幻象引用有什麼區別?
- Java/Android中的強引用、軟引用、弱引用、虛引用JavaAndroid
- 強引用、軟引用、弱引用、幻象引用再不理解就晚了
- php引用discuz地址獲取關鍵詞(www.rijigu.com)PHP
- PHP匿名函式使用use關鍵詞引用外部空間變數PHP函式變數
- 每天一個 PHP 語法四引用使用及實現PHP
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列