PHP-来自变量的函数名

PHP-来自变量的函数名,php,function,variables,Php,Function,Variables,好的,我已经找到了一个可能的解决方案,但由于某些原因,我无法使它在我的应用程序中工作。显然,如果我有一个包含name函数的变量,我可以使用 <?php echo $variable(); ?> 我得到一个警告: Message: Illegal string offset 'taxon_field' 还有一个致命的错误: Call to undefined function p() 我在这里真的不懂,因为只回显变量会给出'form_input',但回显$variable()只会

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

<?php echo $variable(); ?>
我得到一个警告:

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\u field']
然后PHP将尝试将
'taxon\u field'
转换为整数,以便索引到字符串中。这将导致与通常情况相同的
0
,因此整个表达式将获得字符串的第一个字母

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

使用


所造成的混乱实际上是我自己的错,因为我没有提供一些我认为不重要但却是关键的传统信息。我的$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()

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

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



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

他得到“调用未定义的函数p()”错误的事实不是意味着以这种方式调用函数确实有效吗?我忘了提到我也尝试过。不幸的是,它给出了同样的警告和同样的错误。如果是这样,它是如何(以及为什么)将函数名从“form_input”(或存储在给定变量中的任何其他内容)更改为仅“p”的。这对我现在来说是有意义的。但是为什么(哦,为什么?!)即使我将数组的值存储在单个变量中,我仍然无法得到我想要的东西?特别是因为$var='form_input'确实能像预期的那样工作,但是$var=$instance['taxon_field']不能工作?我用
函数form_field(){echo'yay';}$instance=array('taxon_field'=>'form_field')创建了一个PHP示例文件$实例['taxon_field']()。。而且效果非常好。听起来,
$instance
是一个字符串,而不是数组(在你的例子中)很确定这是一个PHP5.3的添加。感谢NewFurnity的反馈,至少我很高兴我没有发疯:)但我已经为此绞尽脑汁一个小时了,我仍然无法找出我做错了什么。wes我正在运行PHP版本5.4.4,以提供更多说明。如果我输入$name=$instance['taxon_field'],然后回显$name,我就会得到正确的$name值。但是如果我回显$name(),我的$instance数组的值会突然转换为$instance['taxon_value']的值,这是$instance的最后一个数组成员。我知道您的答案应该有效。但它在我的应用程序中不起作用的原因我似乎无法找到,这让我感到困惑。我认为我们需要看到完整的脚本也适用于我:。codepad.org正在运行PHP5.2,我已经用PHP5.4.4在本地对它进行了测试,结果是一样的。好吧,我想我知道了为什么这不起作用,但仍然不知道如何覆盖它。我将在新的答案中发布更多信息。您将收到错误,因为echo没有任何功能(手册称之为“语言构造”)。试试“var_dump”,你会发现它与“real”内置函数一起工作。现在我们正在使用多维数组:你确定$biger_数组的所有项都是数组吗?返回的内容
var_dump($content['id'])
(与您在codeigniter论坛上的帖子相关)噢,哇,关于“echo”,您是对的。愚蠢的我。谢谢你澄清这一点,这其实是有道理的
var_dump($content['id']
给出了这样的结果:我还通过
$content['id']
获得了预期的结果:(同样在PHP5.4.4中进行了测试)。在服务器上运行时也会得到这个结果吗?问题是,我在同一个视图文件中定义的数组也会得到这个结果。不幸的是,正如我所说,这是一个Codeigniter项目,我需要通过从控制器传递到视图的数组来实现同样的结果。如果我尝试对两个相同的数组执行相同的操作(一个从控制器传递,另一个在视图文件中定义),我得到了前面提到的错误和后面的预期结果。这开始让我感到沮丧。
Message: Illegal string offset 'taxon_field'
Call to undefined function p()
call_user_func($instance['taxon_field']);
<?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!');
}
?>