Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP eval返回null,但调用了一个返回_Php_Null_Eval - Fatal编程技术网

PHP eval返回null,但调用了一个返回

PHP eval返回null,但调用了一个返回,php,null,eval,Php,Null,Eval,我有一个,我认为相当简单的问题,但我不知道我做错了什么。我有一个用PHP函数eval调用的函数。我希望结果会是一个自建的ArrayList。但是当我使用gettype时,我看到的结果是NULL。即使我在eval ed函数中使用了return 据我所知,我是在按照文档进行操作,但不知怎么的,它不起作用。有什么建议吗 代码片段 <?php $widgetList = new ArrayList(); for($i = 0; $i

我有一个,我认为相当简单的问题,但我不知道我做错了什么。我有一个用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
                    }
                }
            ?>
正在求值的函数是:
Model_Navigation::getNavigationByLanguageId(新整数(0)、新ArrayList()、新整数(7))

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


我在这里试图实现的是使用
eval
从$widget->functionCall的值返回ArrayList。

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

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

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

如果运行

function foo() {
  bar();
}
function bar() {
  return 1;
}
$x=foo();
var_dump($x);
输出将为空。虽然bar()返回一个值,但foo()不返回。bar()的返回值为“丢失”。如果使用eval()也一样

印刷品

NULL
int(1)

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

要使eval返回任何内容,$widgetList->item($i)->functionCall必须以令牌
return

e、 如果

$widgetList->item($i)->functionCall == 'return myFunc();';
那你就没事了

但如果

$widgetList->item($i)->functionCall == 'myFunc();';
这就是eval()不返回任何内容的原因。另外,注意执行eval()时生成的任何错误——如果代码无法解析或抛出任何类型的错误,这也可以解释eval()为什么不返回任何内容

您应该能够完全取消对eval的调用,但最坏的情况是使用

编辑: 例如:

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

这可能更可取,因为它避免了编译开销,不太可能出现中断等情况。

您可以包含有问题的代码吗?您可以粘贴有问题的代码吗?您的代码示例可以帮助我们回答问题。顺便问一下,你是在评估函数声明还是函数调用?嗨,弗兰克!在本例中,functionCall中包含的代码是
Model_Navigation::getNavigationByLanguageId(新整数(0)、新ArrayList()、新整数(7))。在eval函数中添加
return
,解决了这个问题!谢谢+你好,沃克,也谢谢你的回答!它成功了,但我只能标记一个答案为已接受+1.
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));