2010-01-11 70 views
0

我有一個,我覺得相當容易,但我無法弄清楚我做錯了什麼。我有一個函數,我用PHP的函數eval調用。我期待一個自建的ArrayList能夠獲得結果。但是,當我使用gettype時,我看到的結果是NULL。儘管我在評估函數中使用returnPHP的eval返回null,但返回被稱爲

據我所知,我正在通過文檔播放它,但不知何故,它不工作。有什麼建議麼?

代碼片段

<?php 
       $widgetList = new ArrayList(); 

       for($i = 0; $i < $selectedTemplate->Regions->count(); $i++) 
       { 
        $region = $selectedTemplate->Regions->item($i); 

        if($region->Widget->selectiveContent == 1) 
        { 
         $widgetList->add($region->Widget); 
        } 
       } 

       if($widgetList->count() > 0) 
       { 
      ?> 
      <tr> 
       <td colspan="2"> 
        <strong>Widget instellingen</strong> 
        <hr size="1" width="100%" color="#333"/> 
       </td> 
      </tr> 
      <?php 
        for($i = 0; $i < $widgetList->count(); $i++) 
        { 
      ?> 
      <tr> 
       <td class="w150"> 
        <?= $widgetList->item($i)->title ?> 
       </td> 
       <td> 
        <select name="widget_<?= $widgetList->item($i)->id ?>" class="full"> 
        <?php 
         $itemList = eval($widgetList->item($i)->functionCall); 
         for($j = 0; $j < $itemList->count(); $j++) 
         { 
          $selected = null; 
          if($_POST["widget_".$widgetList->item($i)->id] == $itemList->item($j)->id) 
          { 
           $selected = " selected=\"selected\""; 
          } 
        ?> 
         <option value="<?= $itemList->item($j)->id ?>"<?= $selected ?>><?= $itemList->item($j)->title ?></option> 
        <?php 
         } 
        ?> 
        </select> 
       </td> 
      </tr> 
      <?php 
        } 
       } 
      ?> 

EVAL-ED代碼

public function getNavigationByLanguageId(Integer $parent, ArrayList $objectList, Integer $language) 
    { 
     $query = DataAccess::getAdapter()->query(" 
        SELECT  * 
        FROM  `navigation` 
        WHERE  `parent_id`  = ".$parent->value." 
        AND   `language_id` = ".$language->value." 
        AND   `website_id` = ". $_SESSION["currentSite"]["id"]." 
        ORDER BY `sort_order`"); 

     while($result = DataAccess::getAdapter()->fetchAssoc($query)) 
     { 
      $link = new Model_Navigation(); 

      $link->id   = $result["id"]; 
      $link->language  = $result["language_id"]; 
      $link->parent  = $result["parent_id"]; 
      $link->Page   = Model_Page::getPageById(new Integer($result["page_id"])); 
      $link->title  = $result["title"]; 
      $link->externalUrl = $result["external_url"]; 
      $link->sortOrder = $result["sort_order"]; 

      $objectList->add($link); 
      Model_Navigation::getNavigationByLanguageId(new Integer($result["id"]), $objectList, $language); 
     } 

     return $objectList; 
    } 

功能是EVAL-ED是:Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));

關於代碼一些更交代 我在我的新CMS中使用了這個功能。用戶可以設計模板並將小部件放置在定義的區域中,這與jQuery提供的portlet功能非常相似。小部件是由我安裝的網站,我已經建立了一個選項來提供一個函數調用來檢索小部件被標記爲'選擇性內容'時的對象列表。

我在這裏試圖實現的是使用eval從$ widget-> functionCall的值返回ArrayLists。

+0

你能否包含有問題的代碼? –

+0

請問您可以粘貼有問題的代碼嗎? – rui

+0

您的代碼示例可以幫助我們解決問題。順便說一下,你是否在執行函數聲明或函數調用? – Eineki

回答

5

在此行中,什麼是$ widgetList->項目($ i)的內容 - > functionCall? $ itemList = eval($ widgetList-> item($ i) - > functionCall);

對於EVAL返回任何東西,$ widgetList->項目($ I) - > functionCall必須與令牌return

例如開始如果

$widgetList->item($i)->functionCall == 'return myFunc();'; 

那麼你的罰款

但如果

$widgetList->item($i)->functionCall == 'myFunc();'; 

那麼這就是爲什麼的eval()不返回任何東西。另外,請注意執行eval()時生成的任何錯誤 - 如果代碼未能解析或拋出任何錯誤,這也可能解釋爲什麼eval()不返回任何內容。

你應該能夠與呼叫做掉完全EVAL,雖然 - 在最壞的情況,使用call_user_func()

編輯: 對於示例:

eval('return Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));'); 

這可以寫成:

call_user_func(array('Model_Navigation', 'getNavigationByLanguageId'), new Integer(0), new ArrayList(), new Integer(7)); 

這可能是最好的,因爲它避免了編譯開銷,是不易損壞等

+0

嗨,弗蘭克!在這個特殊情況下,包含在functionCall中的代碼是'Model_Navigation :: getNavigationByLanguageId(new Integer(0),new ArrayList(),new Integer(7));'。在eval函數中添加'return'解決了這個問題!謝謝! +1 – Ben

1

Eval是邪惡的(並且在大多數情況下是駭人聽聞的)。我會建議發佈你的代碼,我們也許可以爲你替代那部分代碼。

0

如果您在eval函數外部運行代碼並且沒有問題,那麼您可能需要檢查eval()函數文檔。

確保字符串被「評估」是「沒有錯」/格式正確。

2

如果運行

function foo() { 
    bar(); 
} 
function bar() { 
    return 1; 
} 
$x=foo(); 
var_dump($x); 

輸出將是'空」。雖然bar()返回值foo()不會。 bar()的返回值是「丟失」。同樣的,如果你使用eval()

function bar() { 
    return 1; 
} 
$x=eval('bar();'); 
var_dump($x); 
$x=eval('return bar();'); 
var_dump($x); 

打印

NULL 
int(1) 
+0

嗨VolkerK,也謝謝你的回答!它做了訣竅,但我只能標記一個接受的答案。 +1! – Ben