【问题标题】:PHP function return. Cheats allowedPHP 函数返回。允许作弊
【发布时间】:2011-03-01 14:08:14
【问题描述】:

好的。

我有一个很长很复杂的函数。

它看起来几乎像这样:

    <?php
            function hello() {

                    echo 'My Function!' ?>
                    <ul>
                    <li> Blablabla </li>
                    <ul>
                    (...)
    <?php } ?>

这里最大的问题是我无法回应任何内容。

我的函数必须返回它的内容而不是回显或直接输出(它必须是这样,它是一个 Wordpress 短代码,当我回显时 - 内容会显示在页面顶部 - 总是,而不是在我想要它们的地方):

   <?php
                function hello() {

                        $output .= 'My Function!'; 
                        $output .= '<ul>';
                        $output .='<li> Blablabla </li>';
                        $output .='<ul>';
                        (...)

                        return $output;
         } ?>

我希望这很容易。

现在,真正的问题是:

我有大量的直接输入代码,例如:

?> 

<div>
    <span>
        <p>Smth</p>
        <a>smth</a>
    </span>
</div>

<?php

到处添加 $output 会破坏漂亮的段落/空白,并且代码变得非常难以阅读和理解(现在所有 HTML 元素都是变量的一部分,所以即使我的 php 编辑器也没有很好地处理它们并将它们着色为 PHP 元素)。

另外,我有很多这样的台词:

<a href="<?php bloginfo('template_directory');  ?>/includes/php/timthumb.php?src=<?php echo $url; ?>&h=<?php if($items=="one") echo 320; elseif($items=="two") echo 230; elseif($items=="three") echo 180; elseif($items=="four") echo 130; ?>&w=<?php if($items=="one") echo 600; elseif($items=="two") echo 420; elseif($items=="three") echo 277; elseif($items=="four") echo 203; ?>" title="<?php the_title(); ?>" class="link">

(是的,这是一行)

而且我完全不知道如何将这些行添加到 $output。

$output .= '<a href="<?php bloginfo('template_directory');  ?>/includes/php/timthumb.php?src=<?php echo $url; ?>&h=<?php if($items=="one") echo 320; elseif($items=="two") echo 230; elseif($items=="three") echo 180; elseif($items=="four") echo 130; ?>&w=<?php if($items=="one") echo 600; elseif($items=="two") echo 420; elseif($items=="three") echo 277; elseif($items=="four") echo 203; ?>" title="<?php the_title(); ?>" class="link"> ';

当然不起作用(即使在 ' 和 " 之前使用 \'s)。

我相信必须有一种更简单的方法来附加所有要返回的代码,但是怎么做呢? 我试过 ob_start();在代码之前并返回 ob_get_clean();之后,但它输出的是简码名称而不是内容。

【问题讨论】:

  • 您的实际问题不是您可以或不能输出的冗长解释,而是您的第一行,说明:“我有一个非常长且非常复杂的函数。”函数应该简短易懂。他们应该做一件事。而且它们应该没有像回显内容这样的副作用。试着用简单的英语描述你的函数是做什么的。为每个“and”创建一个新函数并以它的作用命名。将您的代码分解成小块。消除复杂性后,再次查看源代码。
  • @Gordon 你是对的,但你不是。我所有的功能总是做一件事。这是 Wordpress 短代码,它抓取一组项目并根据属性显示它们。有 10 个属性,每个属性大约有 10 个 if 语句。还有 while 循环抓取帖子等。将其分解为较小的函数看起来毫无意义,因为我有大约 100 个短代码,我需要大约 100 个短代码。 10k 个独立的函数来做他们所做的事情。
  • 无意冒犯,但这只是进一步证明设计/wordpress 已损坏。
  • @Gordon 好吧,公平地说,这些 Wordpress 功能背后的想法 是为几乎没有技术知识的人提供一个“低技术”脚本界面来定制他们的博客 -模板函数的整个基础都是以这种方式构建的,参见。 the_loop()the_title() 等等……毫无疑问,这仍然是糟糕的设计

标签: php function return echo


【解决方案1】:

很难想象您在这里要解决的问题是什么 - 尽管我不熟悉 wordpress。你不能只调用输出应该去的函数吗?

您可以使用输出缓冲 - 像往常一样使用 echo/print 但是...

ob_start();
hello();
$output=ob_get_contents();
ob_end_clean();

但这并不能解决您仍然需要在页面的正确位置发送到浏览器的问题 - 如果可以的话:

print $output;

在正确的地方,那么你一定可以做到:

hello();

在同一个地方。

【讨论】:

  • Wordpress 中有简码,当你写例如 [hello] 时,它会带来函数 hello()。关键是在整个页面之前处理短代码,其中所有不在“返回”中的内容都将显示在页面顶部。总是。所以不可能有任何元素在它们之上或它们之间。我希望你明白我的意思。我要测试 ob_start();事情,它会在许多情况下工作(不同和/或相同的功能?)。
  • 提示:你可以使用$output = ob_get_clean();,它是$output = ob_get_contents(); ob_end_clean();的简写。
【解决方案2】:

我同意 symcbean,但这可能是与 Wordpress 集成的一种更实用的方法:如果您现在有一个名为 hello() 的函数来显示 HTML,您可能需要考虑将该函数重命名为 hello_content()(或类似的东西)并用 symcbean 给你的建议替换 hello( ) 函数:

function hello_content( ) {
   echo "foo";
}

function hello( ) {
   ob_start( );
   hello_content( );
   return ob_get_clean( );
}

这应该可以解决您的直接问题。

【讨论】:

  • 这种方法看起来不错,但我的代码有点复杂,每个短代码都有它的属性,所以看起来像 hello($atts) { my code }。当我使用您的代码时,属性似乎不起作用。但其余的都很好!啊:(
  • 好吧,终于成功了!有小故障:stackoverflow.com/questions/5161626/output-buffer-shows-1
【解决方案3】:

PHP Heredoc 语法将使事情看起来整洁,您可以将输出返回给变量。只要您不需要任何常量,它就可以正常工作。

你以这种方式使用它:

function bar() {
    $var = <<<EOV
    anything here
    anything there
EOV;

    return $var;
}

【讨论】:

  • EOV; 之前不能有空格,因为“结束标识符必须从行的第一列开始。”(引用自手册)
  • @Dunhamzzz,这给了我“解析错误:语法错误,意外的 T_SL”,并且
  • @anonymous,检查&lt;&lt;&lt;EOV后面是否有空格或制表符
  • @binaryLV 对!完毕。现在它显示'解析错误:语法错误,意外']',需要 T_STRING 或 T_VARIABLE 或 T_NUM_STRING'。该功能的屏幕截图 - img5.imageshack.us/f/taxm.png(注意红色下划线和颜色)。当我用 \ 将 [] 更改为 [] 时,它显示“意外 $end”(在最后 - echo get_taxonomy_list_html(our_porfolio_types); - 行)。
  • 这与我提供的答案无关,另外您需要阅读输出字符串和正确的 HTML,因为您在屏幕截图中的 HTML 上缺少双引号,并且可能应该将字符串与变量使其更易于阅读。
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2022-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2015-04-23
相关资源
最近更新 更多