PHP eval返回null但调用return

时间:2010-01-11 22:36:28

标签: php null eval

我有一个,我认为相当容易,但我无法弄清楚我做错了什么。我有一个函数,我用PHP的函数eval调用。我期待一个自建的ArrayList得到结果。但是当我使用gettype时,我看到结果是NULL。即使我在eval-ed函数中使用return

据我所知,我正在通过文档播放它,但不知怎的,它不起作用。有什么建议吗?

代码片段

<?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
                    }
                }
            ?>

评估代码

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;
    }

正在评估的功能是:Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));

关于代码的更多解释 我在我的新CMS中使用这个功能。用户能够设计模板并将窗口小部件放置在已定义的区域中,这非常类似于jQuery提供的portlet功能。我为网站安装了小部件,我建立了一个选项,当小部件被标记为“选择性内容”时,提供一个功能调用来检索对象列表。

我在这里尝试实现的是使用eval从$ widget-&gt; functionCall的值返回ArrayLists。

4 个答案:

答案 0 :(得分:5)

在这一行,$ widgetList-&gt; item($ i) - &gt; functionCall的内容是什么?     $ itemList = eval($ widgetList-&gt; item($ i) - &gt; functionCall);

要让eval返回任何内容,$ widgetList-&gt; item($ i) - &gt; 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));

这可能更好,因为它避免了编译开销,不太可能破坏等等。

答案 1 :(得分:2)

如果你跑

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

输出为“NULL”。虽然bar()返回值foo()没有。 bar()的返回值是“丢失”。如果您使用eval()

,则相同
function bar() {
  return 1;
}
$x=eval('bar();');
var_dump($x);
$x=eval('return bar();');
var_dump($x);

打印

NULL
int(1)

答案 2 :(得分:1)

Eval是邪恶的(在大多数情况下是hackish)。我建议发布您的代码,我们也许可以为您删除该部分代码。

答案 3 :(得分:0)

如果你在eval函数之外运行代码并且它没问题,那么你可能需要检查eval()函数文档。

确保要“评估”的字符串“没有错误”/格式正确。