首頁 >後端開發 >php教程 >求簡單介紹下php的變數作用域。 。 。

求簡單介紹下php的變數作用域。 。 。

WBOY
WBOY原創
2016-08-20 09:04:01936瀏覽

最近要寫點php,沒有寫過,只會js。 php裡面好像不像js一樣變數是有個作用域鏈引用。下面程式碼這樣的話,如何實現呢?

<code>function A(){
    $num = 0;
    function B(){
        //这里如何引用到变量$num???
    }
}</code>

查了一下說B裡面global $num一下可以引用全域變數$num,但好像$num不是全域的。 。 。求指點下。

回覆內容:

最近要寫點php,沒有寫過,只會js。 php裡面好像不像js一樣變數是有個作用域鏈引用。下面程式碼這樣的話,如何實現呢?

<code>function A(){
    $num = 0;
    function B(){
        //这里如何引用到变量$num???
    }
}</code>

查了一下說B裡面global $num一下可以引用全域變數$num,但好像$num不是全域的。 。 。求指點下。

轉:
JavaScript可以直接在匿名函數裡使用外部變數。
PHP匿名函數預設不能直接呼叫所在程式碼區塊的上下文變量,需要透過使用use關鍵字連接閉包(匿名函數)和外部變數。

<code>function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
} 
getMoney();
//输出:
//1
//报错,找不到dorllar变量
</code>

可以看到,dollar沒有在use關鍵字中聲明,在這個匿名函數裡也就不能取得到它,所以開發中要注意這個問題。

有人可能會想到,是否可以在匿名函數中改變上下文的變量,但我發現是不可以的:

<code>function getMoney() {
    $rmb = 1;
    $func = function() use ( $rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}
getMoney();
//输出:
//1
//1
</code>

原來use所引用的也只不過是變數的一個副本而已。

如果想要完全引用變量,而不是複製,則需要在變數前面加上一個 & 符號:

<code>function getMoney() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}
getMoney();
//输出:
//1
//2
</code>

如果將​​匿名函數傳回給外界,匿名函數會保存use所引用的變量,而外界則不能得到這些變量,這樣形成『閉包』這個概念可能會更清晰一些:

<code>function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}
$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();
//输出:
//1
//2
//3
</code>

<code class="php">function A()
{
    $num = 0;
    call_user_func(function () use ($num) {
        //这么用$num
    });
}</code>

上面的答案只是回答你的問題, 你最好先看一遍手冊, 熟悉PHP的基本語法, 不然碰到一個問題就在問答網站在問一次, 效率太低了. 千萬不要用js的方式寫php

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn