[PHP] PHP4中的引用

來源:互聯網
上載者:User

引用是個很奇妙的東西,有點類似C中的指標,但是又不一樣!在PHP中,引用只是
變數內容的另外一個名字。下面我打幾個比方說明一下(只是PHP4的內容,PHP5中
關於類和對象的用法有很大的變化,還沒有仔細研究過):

1、 $a =& $b;
這裡建立了一個引用$a, 他指向變數名為$b的變數所指向的變數內容,羅嗦一點了
啊。打個比喻:就好比一個抽屜裡面有一個蛋糕,b有鑰匙,現在b複製了一把鑰匙
給a,a和b都可以開啟這個抽屜,吃這個蛋糕。

2、將一個返回應用的操作綁定到一個變數:
        $a =& new Someclass();
        $a =& call_function();
        new操作符返回Someclass的執行個體的拷貝,通過引用操作符,將這個拷貝綁
        定到$a上,也就是說$a指向這個執行個體。如果是使用賦值操作符=,那麼將
        複製這個執行個體,並且讓$a指向這個新複製的執行個體上。

3、引用傳遞
        function Somefunction(&$a) {
                $a += 10;
        }
        $a = 10;
        Somefuntion($a);
        // now $a is 20
       
        通過這個方法,可以在函數範圍內操作函數範圍外的變數了。這個用法感
        覺就和C裡面的指標比較類似。比如我寫一個開啟檔案的函數。
        function opensomefile(&$fd) {
                global $error;
                $fd = @fopen("somefile");
                if ($fd) {
                        return true;
                } else {
                        $error = "can not open file";
                        return false;
                }
        }
       
        然後就可以和c寫很相識的程式了:
        // 初始化兩個變數
        $fd    = null;
        $error = null;
        if (opensomefile($fd)) {
                // do something
        } else {
                exit($error);
        }
       
        注意,這裡只需要在定義函數的時候,在形參前面加上&符號,在調用這
        個函數的地方就不需要了。這個和下面的引用返回不一樣!
       
4、引用返回
        function &foo(){
                // do something
                $a =& new someclass();
                return $a;
        }

        $refa =& foo();
       
        這裡函數foo中建立了一個對象,$a 就是這個對象的引用,函數返回的是
        這個引用。我們想在函數外部使用這個對象,就需要使用這樣的方法,
        $refa =& foo(); 這一句話將函數foo返回的引用綁定到變數$refa上,也
        就是說$refa和foo內部的$a指向同一個內容。
       
        注意這裡在定義函數和調用函數的地方都要有&符號。
       
        這種方法在使用Factory模式設計程式的時候經常用到,比如PEAR::DB庫
        等等。

5、使用unset($var)來銷毀一個引用的時候,不會銷毀$var指向的內容:
        $a = 10;
        $b =& $a;

        echo $a;
        echo "/n";
        echo $b;
        echo "/n";
        unset($b);
        echo $a;
       
        如上代碼,unset($b),並不會讓$a也產生變化。還是抽屜和鑰匙,a和b
        都有同一個抽屜的鑰匙。b把鑰匙扔掉,但是a還有,還是可以開啟抽屜。
       
6、我剛剛遇到的一個問題:
        function foo(&$a) {
                $a =& new someclass();
        }
        $aaa = null;
        foo($aaa);
       
        這樣的用法並不能讓$aaa指向someclass的一個執行個體。為什麼呢?因為在
        調用foo的時候,形參$a是一個指向$aaa的引用,即$a =& $aaa;然後在函
        數內部,$a又被重新指向另一個對象了。所以,並沒有操作$aaa。就像b
        從a那裡得到開抽屜甲的鑰匙,但是不巧的是,他將這把鑰匙做成開抽屜
        乙的了,那麼他自然不能再開抽屜甲咯。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.