0

好的,我已经找到了一个可能的解决方案,但由于某种原因,我无法让它在我的应用程序中工作。显然,如果我有一个包含名称函数的变量,我可以使用

<?php echo $variable(); ?>

输出具有相同名称的函数。

我正在使用 Codeigniter。它的表单助手中有一个函数来输出一个文本字段,即

<?php form_input(); ?>

我有一个变量

<?php $instance['taxon_field'] = 'form_input'; ?>

如果我回显这个变量,我会得到所需的值“form_input”。但是,一旦我尝试回应

$instance['taxon_field']()

我收到警告:

Message: Illegal string offset 'taxon_field'

和一个致命错误:

Call to undefined function p()

我在这里真的一无所知,因为仅回显变量会给出'form_input',但回显$variable()只会给出'p'。

我在哪里做错了?

4

3 回答 3

1

这里的实际问题$instance不是数组,而是字符串。从报错信息来看,是一个值以 . 开头的字符串p

该语法$var[$key]不仅用于访问数组元素,还用于索引字符串,其中$var[0]将是第一个字符(实际上是字节)$var等。如果$instance是字符串并且您编写,$instance['taxon_field']那么 PHP 将尝试转换'taxon_field'为整数以便索引到字符串中。这导致0按照通常的转换规则,因此整个表达式为您获取字符串的第一个字母。

假设字符串以p它开头,那么它为什么会尝试调用具有该名称的函数就很明显了。

于 2012-09-13T22:32:29.987 回答
1

使用call_user_func()

call_user_func($instance['taxon_field']);
于 2012-09-13T22:53:14.667 回答
0

造成的混乱实际上是我自己的错,因为我没有提供一些我认为不重要但结果很重要的附加信息。我的 $instance[] 数组实际上是 foreach 循环的结果(准确地说是其中两个),并且是更大的多维数组的一部分。实际代码更复杂,但我会尝试正确表示它:

<?php
$bigger_array = array(
    0 => array(
        'field_one' => 'value_one',
        'field_two' => 'value_two',
        'field_three' => 'new_function'
    ),
    1 => array(
        'field_one' => 'new_value_one',
        'field_two' => 'new_value_two',
        'field_three' => 'echo'
    )
);

function new_function()
{
    echo 'New function called.';
}

foreach($bigger_array as $instance)
{
    $name = $instance['field_three'];
    $name('Hello World!');
}
?>

这将输出以下内容:

调用了新函数。致命错误:在第 69 行的 /opt/lampp/htdocs/bla.php 中调用未定义的函数 echo()

换句话说,新定义的函数可以正常工作,但内置的“回声”却不行。

这实际上不是我最初的问题,这是我在尝试调试初始问题时遇到的问题。最初的问题是从一维数组创建函数可以正常工作。而在 foreach 循环中从多维数组创建函数会将数组转换为具有其最后一个成员的值的字符串。

现在,我仍然不能完全回答我的问题,但我认为我提供的信息可能会导致解决方案。在我在这里给出的简化示例中,为什么我收到未定义 echo() 函数的消息,而新函数工作正常?

于 2012-09-14T21:13:40.790 回答