PHP Lamba风格的函数代码抛出了大量未定义的变量错误

时间:2013-07-24 01:23:08

标签: php anonymous-function heredoc

我正在使用PHP create_function创建一个lamba样式的函数,其内容由heredoc样式字符串定义。一切都很好,直到我将代码移动到Hostgator帐户。关于Hostgator环境的一些事情导致该功能完全失败。

它看起来像heredoc正常工作,并且create_function似乎正在执行。但是当函数本身被调用时,它会抛出大量错误,声称每个局部变量都是未定义的!我很困惑!有人见过这个吗?这是代码:

$func_code = <<<EOT
extract( shortcode_atts( array('style' => '','class' => '', 'id' => '', 'gutter' => 'm'), $atts ) );
$col_and_gutter = isset($gutter) ? 'needle-' . $gutter : 'needle-m';

switch ($gutter) {
    case 'ew': $gutter = 'col-extra-wide-gutter'; break;
    case 'w': $gutter = 'col-wide-gutter'; break;
    case 'm': $gutter = 'col-med-gutter'; break;
    case 'n': $gutter = 'col-narrow-gutter'; break;
    case 'none': $gutter = 'col-no-gutter'; break;
}

if ($id != '') $id = 'id="' . $id . '"';
if ($style != '') $style = 'style="' . $style . '"';
$returnval =  '<div ' . $id . ' ' . $style . ' class="col-responsive ' . $col_and_gutter . " " . $gutter . " " . $class . '">';

$returnval .= '<div class="g1"><div class="g2"><div class="g3">' . do_shortcode($content) . '</div></div></div>';
$returnval .= '</div>';
return $returnval;
EOT;            

$func_code = str_replace('needle', $shortcode, $func_code);
$func_handle = create_function('$atts,$content', $func_code); 
add_shortcode($shortcode, $func_handle);
add_shortcode($shortcode . '-n', $func_handle);
add_shortcode($shortcode . '-nn', $func_handle);

以下是错误输出:

  

注意:未定义的变量:atts in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第129行

     

注意:未定义的变量:col_and_gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第129行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第129行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第131行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第132行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第133行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第134行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第135行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第136行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第139行

     

注意:未定义的变量:id in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第139行

     

注意:未定义的变量:id in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第139行

     

注意:未定义的变量:id in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第140行

     

注意:未定义的变量:样式   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第140行

     

注意:未定义的变量:样式   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第140行

     

注意:未定义的变量:样式   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第141行

     

注意:未定义的变量:returnval in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第141行

     

注意:未定义的变量:id in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第141行

     

注意:未定义的变量:样式   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第141行

     

注意:未定义的变量:col_and_gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第141行

     

注意:未定义的变量:gutter in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第141行

     

注意:未定义的变量:类in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第142行

     

注意:未定义的变量:returnval in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第142行

     

注意:未定义的变量:内容   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第143行

     

注意:未定义的变量:returnval in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   在第144行

     

注意:未定义的变量:returnval in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php   第145行

     

解析错误:语法错误,意外')'in   /home3/ade207/public_html/wp-content/themes/armstrongparent/lib/shortcodes.php(148)   :第1行的运行时创建函数

1 个答案:

答案 0 :(得分:0)

@Passerby。谢谢,这让我想到了这个问题。

所有$变量都是空白区域!!这是因为heredoc执行自动变量替换。所以一个人可能想知道它在其他环境中是如何工作的:GoDaddy和Linode VPS但不在Hostgator上......

它在Hostgator上爆发的原因是因为当我第一次上传它时,Heredoc系列最初是Nowdoc。它抛出一个错误,所以我通过删除单引号将其更改为Heredoc。我根本没想过,愚蠢的是没有意识到变量替换中的所有变量因此所有变量都被替换为空字符串而不是保留为函数代码的字符串文字。

显然,Hostgator没有运行PHP 5.3或更高版本,这就是Nowdoc无法运行的原因。实际上,这意味着我需要修改脚本以便更加向后兼容。我可能只需要将所有变量转换为丑陋的样子。