萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP引用(&)各種使用方法實例詳解

PHP引用(&)各種使用方法實例詳解

 php的引用(就是在變量或者函數、對象等前面加上&符號),在PHP 中引用的意思是:不同的名字訪問同一個變量內容。與C語言中的指針是有差別的.C語言中的指針裡面存儲的是變量的內容,在內存中存放的地址

php的引用(就是在變量或者函數、對象等前面加上&符號),在PHP 中引用的意思是:不同的名字訪問同一個變量內容。與C語言中的指針是有差別的.C語言中的指針裡面存儲的是變量的內容,在內存中存放的地址。   1.變量的引用 PHP 的引用允許你用兩個變量來指向同一個內容    代碼如下:<?     $a="ABC";     $b =&$a;     echo $a;//這裡輸出:ABC     echo $b;//這裡輸出:ABC     $b="EFG";     echo $a;//這裡$a的值變為EFG 所以輸出EFG     echo $b;//這裡輸出EFG ?>   2.函數的引用傳遞(傳址調用) 傳址調用我就不多說了 下面直接給出代碼    代碼如下:<?php       function test(&$a)     {         $a=$a+100;     }     $b=1;     echo $b;//輸出1     test($b);   //這裡$b傳遞給函數的其實是$b的變量內容所處的內存地址,通過在函數裡改變$a的值 就可以改變$b的值了     echo "<br>";     echo $b;//輸出101 ?>     要注意的是,在這裡test(1);的話就會出錯,原因自己去想。 注意:上面的“ test($b); ” 中的$b前面不要加 & 符號,但是在函數“call_user_func_array”中,若要引用傳參,就得需要 & 符號,如下代碼所示:    代碼如下:<?php function a(&$b){     $b++; } $c=0; call_user_func_array('a',array(&$c)); echo $c; //輸出 1 ?> 3.函數的引用返回 先看代碼 代碼如下:<?php function &test() {     static $b=0;//申明一個靜態變量     $b=$b+1;     echo $b;     return $b; } $a=test();//這條語句會輸出 $b的值 為1 $a=5; $a=test();//這條語句會輸出 $b的值 為2 $a=&test();//這條語句會輸出 $b的值 為3 $a=5; $a=test();//這條語句會輸出 $b的值 為6 ?>   下面解釋下:  通過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別 至於原因: 這是PHP的規定 PHP規定通過$a=&test(); 方式得到的才是函數的引用返回 至於什麼是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時。) 這句狗屁話 害我半天沒看懂   用上面的例子來解釋就是 $a=test()方式調用函數,只是將函數的值賦給$a而已, 而$a做任何改變 都不會影響到函數中的$b 而通過$a=&test()方式調用函數呢, 他的作用是 將return $b中的 $b變量的內存地址與$a變量的內存地址 指向了同一個地方 即產生了相當於這樣的效果($a=&$b;) 所以改變$a的值 也同時改變了$b的值 所以在執行了 $a=&test(); $a=5; 以後,$b的值變為了5   這裡是為了讓大家理解函數的引用返回才使用靜態變量的,其實函數的引用返回多用在對象中   另附一個php官方例子:     代碼如下:This is the way how we use pointer to access variable inside the class. <?php class talker{     private $data = 'Hi';     public function & get(){         return $this->data;     }       public function out(){         echo $this->data;     }    } $aa = new talker(); $d = &$aa->get(); $aa->out(); $d = 'How'; $aa->out(); $d = 'Are'; $aa->out(); $d = 'You'; $aa->out(); ?> //the output is "HiHowAreYou"   4.對象的引用    代碼如下:<?php     class a{         var $abc="ABC";     }     $b=new a;     $c=$b;     echo $b->abc;//這裡輸出ABC     echo $c->abc;//這裡輸出ABC     $b->abc="DEF";     echo $c->abc;//這裡輸出DEF ?>   上代碼是在PHP5中的運行效果   在PHP5中 對象的賦值是個引用的過程。上列中$b=new a; $c=$b; 其實等效於$b=new a; $c=&$b; PHP5中默認就是通過引用來調用對象, 但有時你可能想建立一個對象的副本,並希望原來的對象的改變不影響到副本 . 為了這樣的目的,PHP5定義了一個特殊的方法,稱為__clone。 自 PHP 5 起,new 自動返回引用,因此在此使用 =& 已經過時了並且會產生 E_STRICT 級別的消息。 在php4中,對象的賦值是個拷貝過程, 如:$b=new a,其中new a產生的是一個匿名的a對象實例,而此時的$b是對這個匿名對象的拷貝。同理$c=$b,也是對$b內容的一個拷貝。所以在php4中,為了節省內存空間,$b=new a 一般會改成引用的模式,即 $b=& new a。   下面再來個 官方 提供的例子: 在php5中,你不需要額外添加什麼東西就可到達“對象引用”的功能:    代碼如下:<?php class foo{         protected $name;         function __construct($str){                 $this->name = $str;         }         function __toString(){                 return  'my name is "'. $this->name .'" and I live in "' . __CLASS__ . '".' . "n";         }         function setName($str){                 $this->name = $str;         } } class MasterOne{         protected $foo;         function __construct($f){                 $this->foo = $f;         }         function __toString(){                 return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "n";         }         function setFooName($str){                 $this->foo->setName( $str );         } } class MasterTwo{         protected $foo;         function __construct($f){                 $this->foo = $f;         }         function __toString(){                 return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "n";         }         function setFooName($str){                 $this->foo->setName( $str );         } } $bar = new foo('bar'); print("n"); print("Only Created $bar and printing $barn"); print( $bar ); print("n"); print("Now $baz is referenced to $bar and printing $bar and $bazn");   $baz =& $bar; print( $bar ); print("n"); print("Now Creating MasterOne and Two and passing $bar to both constructorsn");   $m1 = new MasterOne( $bar ); $m2 = new MasterTwo( $bar ); print( $m1 ); print( $m2 ); print("n"); print("Now changing value of $bar and printing $bar and $bazn");   $bar->setName('baz'); print( $bar ); print( $baz ); print("n"); print("Now printing again MasterOne and Twon"); print( $m1 ); print( $m2 ); print("n"); print("Now changing MasterTwo's foo name and printing again MasterOne and Twon");   $m2->setFooName( 'MasterTwo's Foo' ); print( $m1 ); print( $m2 ); print("Also printing $bar and $bazn"); print( $bar ); print( $baz ); ?>     輸出:    代碼如下:Only Created $bar and printing $bar my name is "bar" and I live in "foo". Now $baz is referenced to $bar and printing $bar and $baz my name is "bar" and I live in "foo". Now Creating MasterOne and Two and passing $bar to both constructors Master: MasterOne | foo: my name is "bar" and I live in "foo". Master: MasterTwo
copyright © 萬盛學電腦網 all rights reserved