<?php function msg()
msg();
msg();
msg();
上述**,分別輸出0,1,2 靜態變數$a在第一次定義並初始化後就會常駐記憶體,直到指令碼執行完畢。
當第二次呼叫msg()函式時www.cppcns.com,這時的$a值為1,而不會變成0。
那麼問題來了,請看下面的一段**:
$data = array(
array('id' => 1, 'title' => '衣服', 'parent' => 0),
array('id' => 2, 'title' => '鞋子', 'parent' => 0),
array('id' => 3, 'title' => '襯衫', 'parent' => 1),
array('id' => 4, 'title' => 't恤', 'parent' => 1),
array('id' => 5, 'title' => '運動鞋', 'parent' => 2),
array('id' => 6, 'title' => '休閒鞋', 'parent' => 2),
);$data2 = array(
array('id' => 1, 'title' => '食物', 'parent' => 0),
array('id' => 2, 'title' => '肉食', 'parent' => 1),
array('id' => 3, 'title' => '素食', 'parent' => 1),
array('id' => 4, 'title' => '牛肉', 'parent' => 2),
array('id' => 5, 'title' => '麵條', 'parent' => 3),
array('id' => 6, 'title' => '饅頭', 'parent' => 3),
);//生成樹型資料
function gentree($items, $id = 'id', $pid = 'parent', $son = 'child')
foreach ($items as $item) else
} unset($tmpmap);
return $tree;
}//通過給定資料,返回option的字串,用於select下拉框
function getopts($data, $idarr = array(), $level = 0, $son = 'child')
}} return $opt;
}$data = gentree($data);
echo '';
//第一次呼叫getopts時,沒有任何問題。
echo getopts($data);
echo '';
$data2 = gentree($data2);
echo '';
//當第二次呼叫時,問題就出現了,還留有上次的資料
echo getopts($data2);
echo '';
上述問題,對於可能多次呼叫的函式,不建議在內部使用靜態變數。
修改getopts函式如下,從函式引數引入乙個外部變數的引用,來解決此問題。
function getopts($data, $idarr = array(), &$opt = '', $level = 0, $son = 'child') }}}
$data = gentree($data);
getopts($data, array(), $opt);
echo '';
echo $opt;
echo '';
$data2 = gentree($data2);
getopts($data2, array(), $opt2);
echo '';
echo $opt2;
echo '';
php靜態變數
在函式執行完後,變數值仍然儲存,並沒有變回初始設定的值0。function test test test test 結果 1 23可以發現a設定靜態變數之後,每次 a的值都儲存下來了。我剛開始還以為這個變數變成了全域性變數,測試發現這個變數 a依然只能在函式裡呼叫,在函式外是不能呼叫的。我們再來看看...
建構函式中的靜態變數
ifndef self sum h define self sum h include unsigned intsum solution1 int n value class sumdefaultconstruct static void reset static unsigned intgetsu...
php 靜態變數static
靜態變數只存在於函式作用域內,也就是說,靜態變數只存活在棧中。一般的函式內變數在函式結束後會釋放,比如區域性變數,但是靜態變數卻不會。就是說,下次再呼叫這個函式的時候,該變數的值會保留下來。只要在變數前加上關鍵字static,該變數就成為靜態變數了。functiontest 第一次執行,nm tes...