好的,我已经找到了一个可能的解决方案,但由于某种原因,我无法在我的应用程序中使用它。显然,如果我有一个包含名称函数的变量,我可以使用
<?php echo $variable(); ?>
以输出具有相同名称的函数。
我正在使用Codeigniter。它的Form helper中有一个输出文本字段的功能,即
<?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"。
我哪里做错了?
$instance
不是一个数组,而是一个字符串。从错误消息判断,它是一个值以p
开头的字符串。
语法$var[$key]
不仅用于访问数组元素,还用于索引到字符串中,其中$var[0]
将是$var
等的第一个字符(实际上是字节)。如果$instance
是字符串,并且您编写$instance['taxon_field']
,则PHP将尝试将'taxon_field'
转换为整数,以便索引到字符串。根据通常的转换规则,这将产生0
,因此整个表达式将获得字符串的第一个字母。
假设字符串以p
开头,那么它尝试调用具有该名称的函数的原因就很明显了。
使用call_user_func()
call_user_func($instance['taxon_field']);
造成的混乱实际上是我自己的错,因为我没有提供一些我认为不重要但却是关键的传统信息。我的$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/lamp/htdocs/bla.php中未定义的函数echo()
换句话说,新定义的函数运行良好,但内置的"echo"则不然。
这实际上不是我最初的问题,这是我在调试最初的问题时遇到的问题。最初的问题是,从一维数组创建函数可以正常工作。而在foreach循环中从多维数组创建函数会将数组转换为具有其最后一个成员值的字符串。
现在,我仍然无法完全回答我的问题,但我认为我提供的信息可能会带来解决方案。在我给出的简化示例中,为什么我得到的消息是echo()函数没有定义,而新函数工作正常?