php 函式中靜態變數使用的問題例項分析
阿新 • • 發佈:2020-03-06
本文例項講述了php 函式中靜態變數使用的問題。分享給大家供大家參考,具體如下:
<?php function msg() { static $a = 0; echo $a++,'<br />'; } msg(); msg(); msg();
上述程式碼,分別輸出0,1,2 靜態變數$a在第一次定義並初始化後就會常駐記憶體,直到指令碼執行完畢。
當第二次呼叫msg()函式時,這時的$a值為1,而不會變成0。
那麼問題來了,請看下面的一段程式碼:
$data = array( array('id' => 1,'title' => '衣服','parent' => 0),array('id' => 2,'title' => '鞋子',array('id' => 3,'title' => '襯衫','parent' => 1),array('id' => 4,'title' => 'T恤',array('id' => 5,'title' => '運動鞋','parent' => 2),array('id' => 6,'title' => '休閒鞋',); $data2 = array( array('id' => 1,'title' => '食物','title' => '肉食','title' => '素食','title' => '牛肉','title' => '麵條','parent' => 3),'title' => '饅頭',); //生成樹型資料 function genTree($items,$id = 'id',$pid = 'parent',$son = 'child') { $tree = array(); $tmpMap = array(); foreach ($items as $item) { $tmpMap[$item[$id]] = $item; } foreach ($items as $item) { if (isset($tmpMap[$item[$pid]])) { $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]]; } else { $tree[] = &$tmpMap[$item[$id]]; } } unset($tmpMap); return $tree; } //通過給定資料,返回option的字串,用於select下拉框 function getOpts($data,$idArr = array(),$level = 0,$son = 'child') { static $opt = ''; if (!empty($data)) { foreach ($data as $k => $v) { $opt .= '<option value=' . $v['id'] . (in_array($v['id'],$idArr) ? ' selected="true"' : '') . '>' . str_repeat(' ',$level * 3) . $v['title'] . '</option>'; if (!empty($v[$son])) { getOpts($v[$son],$idArr,$level + 1,$son); } } } return $opt; } $data = genTree($data); echo '<select>'; //第一次呼叫getOpts時,沒有任何問題。 echo getOpts($data); echo '</select>'; $data2 = genTree($data2); echo '<select>'; //當第二次呼叫時,問題就出現了,還留有上次的資料 echo getOpts($data2); echo '</select>';
上述問題,對於可能多次呼叫的函式,不建議在內部使用靜態變數。
修改getOpts函式如下,從函式引數引入一個外部變數的引用,來解決此問題。
function getOpts($data,&$opt = '',$son = 'child') { if (!empty($data)) { foreach ($data as $k => $v) { $opt .= '<option value=' . $v['id'] . (in_array($v['id'],$opt,$son); } } } } $data = genTree($data); getOpts($data,array(),$opt); echo '<select>'; echo $opt; echo '</select>'; $data2 = genTree($data2); getOpts($data2,$opt2); echo '<select>'; echo $opt2; echo '</select>';
更多關於PHP相關內容感興趣的讀者可檢視本站專題:《php常用函式與技巧總結》、《php字串(string)用法總結》、《PHP陣列(Array)操作技巧大全》、《PHP資料結構與演算法教程》及《php程式設計演算法總結》
希望本文所述對大家PHP程式設計有所幫助。