1. 程式人生 > 程式設計 >php 函式中靜態變數使用的問題例項分析

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

本文例項講述了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程式設計有所幫助。