2015-01-13 59 views
0

昨天我完成了課程的建設,其中我使用了__call方法(前幾天介紹過)。但它運行正確,直到我使用__call方法。如何解決它? - 變量包含的內容應該是

其所有代碼是

public function __call($Function, array $Parameters) 
{ 
    if(method_exists($this, $Function)) 
    { 
     call_user_func_array(array($this, $Name), $Parameters); 
    } 
    else 
    { 
     try 
     { 
      if(!preg_match('/[A-Za-z]_Style|Attribute/i', $Function)) 
      { 
       throw new MarC_Exception(...); 
      } 
     } 
     catch(MarC_Exception $Exception) 
     { 
      $Exception -> ExceptionWarning(...); 
     } 

     $Function = explode('_', $Function); 
     $Function[0] = strtolower($Function[0]); 

     ... 

     $Options = array('Style', 'Attribute'); 

     if($Function[1] == $Options[0]) 
     { 
      if(strtolower($Function[0]) == $this -> Elements['top']) 
      { 
       array_unshift($Parameters, $Function[0]); 
       call_user_func_array(array($this, 'Set_AllElementStyles'), $Parameters); 
      } 
      else 
      { 
       if($this -> Check_StyleName($Parameters[0])) 
       { 
        array_unshift($Parameters, $Function[0]); 
        call_user_func_array(array($this, 'Set_AllElementStyles'), $Parameters); 
       } 
      } 
     } 
     else 
     { 
      if(strtolower($Function[0]) == $this -> Elements['top']) 
      { 
       array_unshift($Parameters, $Function[0]); 
       call_user_func_array(array($this, 'Set_AllElementAttributes'), $Parameters); 
      } 
      else 
      { 
       if($this -> Check_AttributeName($Parameters[0])) 
       { 
        array_unshift($Parameters, $Function[0]); 
        call_user_func_array(array($this, 'Set_AllElementAttributes'), $Parameters); 
       } 
      } 
     } 
    } 
} 

,但問題是,(此時)在preg_match使用。在那裏他看到(我不知道爲什麼)變量函數的內容是Set_AllElementStyles(我在call_user_func_array下面調用)代替(例如)Body_Style。

如果地方爲代碼echo $Function,看看到底發生了什麼,它會調用

  • Body_style如果是在功能代碼開頭或內如果分支的if-else語句
  • Body_StyleSet_AllElementStyles如果在if-else的其他分支中

我在哪裏發生了導致此問題的錯誤?(?如何解決此問題)

編輯1:類RootAssembler_Html的對象的 實施例(即抽象類UniqueAssembler的最終覆蓋),具有__call用法在一起。

$VMaX = new MarC\RootAssembler_Html(); 
$VMaX -> Set_ExportWay(); 
$VMaX -> Set_Content(); 
$VMaX -> Set_Content($Text); 
$VMaX -> Body_Style('background-color', '#ABCDEF'); 
$VMaX -> Body_Attribute('id', 'test'); 
$VMaX -> Execute(); 

輸出:

<html> 
    <head> 
    /* some text that is not set in the first usage of method Set_Content */ 
    </head> 
    <body id='test' style="background-color: #ABCDEF;"> 
    /* some text that was set in the second usage of method Set_Content */ 
    </body> 
</html> 
+0

我認爲你應該提供一些較短的工作代碼,這樣我們就可以更容易地看到問題所在 - 並且你會告訴我們你嘗試了一些調試......順便說一句。你知道你的正則表達式/ [a-z] \ _ St​​yle | Attribute/i匹配:單詞「屬性」還是一個字母后跟'_'和「樣式」? –

+0

@JanLegner:問題不在於正則表達式本身(即使它可能錯誤)。問題是'Set_AllElementStyles'不應該出現在那裏。 –

+0

@Václav如何調用具有參數的'__call'以及實際輸出和期望輸出的示例? – divaka

回答

1

我敢肯定你的問題是這一行:

call_user_func_array(array($this, $Name), $Parameters)

嘗試將其更改爲:

call_user_func_array(array($this, $Function), $Parameters)

並應該工作。

因爲我看不到$Name變量在哪裏定義。它應該作爲參數傳遞給函數或成爲全局函數。但是,在這兩種情況下,我都看不出有什麼關鍵。

而且我建議你用下面的一個,並獲取你想要設置屬性或者樣式類型OT html元素改變你的正則表達式:

preg_match('/([A-Za-z]+)_(Style|Attribute)/i', $Function, $matches)

下面的例子輸入:

preg_match('/([A-Za-z]+)_(Style|Attribute)/i', "Body_Style", $matches1); 
preg_match('/([A-Za-z]+)_(Style|Attribute)/i', "Div_Style", $matches2); 
preg_match('/([A-Za-z]+)_(Style|Attribute)/i', "Div_Attribute", $matches3); 

輸出:

Array 
(
    [0] => Body_Style 
    [1] => Body 
    [2] => Style 
) 
Array 
(
    [0] => Div_Style 
    [1] => Div 
    [2] => Style 
) 
Array 
(
    [0] => Div_Attribute 
    [1] => Div 
    [2] => Attribute 
) 

希望這有助於!

+0

在上面代碼中使用'$ Name'而不是'$ Function' - 我知道應該有'$ Function'。在我的代碼中,它是正確的。最後,在將call_user_func_array的用法改爲經典的這些函數調用(除了Set_AllElementsStyles之外,當然也包括Set_AllElementsAttributes)之後,問題消失了。哎呀,目前我發現了我在那裏的下一個錯誤。 –

相關問題