我有一个,我认为相当简单,但我无法弄清楚我做错了什么.我有一个函数,我用PHP的函数调用eval.我期待一个自建的ArrayList得到结果.但相反,当我使用时,gettype我看到结果是NULL.即使我return在eval-ed函数中使用.
据我所知,我正在通过文档播放它,但不知怎的,它不起作用.有什么建议?
代码片段
<?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
}
}
?>
Run Code Online (Sandbox Code Playgroud)
评估代码
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;
}
Run Code Online (Sandbox Code Playgroud)
正在评估的功能是: Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));
关于 我在新CMS中使用此功能的代码的更多解释.用户能够设计模板并将窗口小部件放置在已定义的区域中,这非常类似于jQuery提供的portlet功能.我为网站安装了小部件,我内置了一个选项,当小部件被标记为"选择性内容"时,提供一个功能调用来检索对象列表.
我在这里想要实现的是使用eval从$ widget-> functionCall的值返回ArrayLists.
在这一行,$ widgetList-> item($ i) - > functionCall的内容是什么?$ itemList = eval($ widgetList-> item($ i) - > functionCall);
要使eval返回任何内容,$ widgetList-> item($ i) - > functionCall必须以令牌开头 return
例如,如果
$widgetList->item($i)->functionCall == 'return myFunc();';
Run Code Online (Sandbox Code Playgroud)
那你很好
但如果
$widgetList->item($i)->functionCall == 'myFunc();';
Run Code Online (Sandbox Code Playgroud)
那就是为什么eval()没有返回任何东西.另外,请注意执行eval()时产生的任何错误 - 如果代码无法解析或抛出任何类型的错误,这也可以解释为什么eval()没有返回任何内容.
你应该能够完全取消对eval的调用 - 尽管 - 最坏的情况下,使用call_user_func()
编辑:为您的示例:
eval('return Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));');
Run Code Online (Sandbox Code Playgroud)
这可以写成:
call_user_func(array('Model_Navigation', 'getNavigationByLanguageId'), new Integer(0), new ArrayList(), new Integer(7));
Run Code Online (Sandbox Code Playgroud)
这可能是可取的,因为它避免了编译开销,不太可能中断等.