2017-02-22 54 views
0

我不明白爲什麼會出現此錯誤。 我想更改數據庫中數據的一些字符串,所以我使用了preg_replace_callback。但是,當我在回調函數的定義中使用

$row = $this->result->fetch_assoc(); 

分析器,錯誤回答

所有代碼:

public function tRsql() { 
     $argNums = func_num_args(); 
     $argsArr = func_get_args(); 

     function change($matches) { 
      if(stripos($matches[0], "sql:")) { 
       $str = ltrim($matches[0], "#sql:"); 
       $str = rtrim($str, ":"); 
       $row = $this->result->fetch_assoc(); 
       $str = $row[$str]; 
       return $str; 
      } else { 
       return $matches[0]; 
      } 
     } 
     for($i = 0; $i < $this->numOfRows; $i++) { 
      $argsArr = preg_replace_callback("/(#sql\:)\S+\:/", "change", $argsArr); 
      $this->tR(implode(",",$argsArr)); 
     } 
    } 
+0

你在哪裏學會了在類方法中定義全局函數?這不是JavaScript。使'change'函數成爲一個類方法,你很好。 – JustOnUnderMillions

+0

函數'change'不是該對象的一個​​方法,而是全局命名空間中的一個動態創建的函數。您當然可以爲動態使用定義這樣的功能。但是,僅此而已。 – arkascha

+0

我試過這個,但是當我定義'change'func。作爲一個類方法,其他錯誤發生:'preg_replace_callback():需要參數2,'change',作爲''有效回調'' – OneManWebDev

回答

0

就做了這種方式:

public function tRsql() { 
    $argNums = func_num_args(); 
    $argsArr = func_get_args(); 

    $change = function ($matches) { 
     if(stripos($matches[0], "sql:")) { 
      $str = ltrim($matches[0], "#sql:"); 
      $str = rtrim($str, ":"); 
      $row = $this->result->fetch_assoc(); 
      $str = $row[$str]; 
      return $str; 
     } else { 
      return $matches[0]; 
     } 
    } 
    for($i = 0; $i < $this->numOfRows; $i++) { 
     $argsArr = preg_replace_callback("/(#sql\:)\S+\:/", $change, $argsArr); 
     $this->tR(implode(",",$argsArr)); 
    } 
} 

在這裏閱讀更多:http://php.net/manual/en/functions.anonymous.php

+0

我改變了''self'change'''change''並將函數定義爲方法並且錯誤消失了:D – OneManWebDev

相關問題