php 函式中靜態變數使用的問題例項分析

2022-09-26 03:15:12 字數 1934 閱讀 6616

<?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...