最近要寫點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