在php中回显函数是不好的做法吗?

Is it bad practice to echo out a bunch of HTML using a function in php and having it something like this:

function my_function() {
global $post;
$custom_fields = get_post_custom();
$some_field = $custom_fields ['some_field'][0];
?>

<div class="something <?php if ($some_field) { echo $special-clas;} ?>">
<div class="something-else">
/* bunch more of html code */
</div>
</div>
}

And then in the page where you want to use that to echo it?

<html>
<body>
.....
....

<?php echo my_function(); ?>

....

I'm unsure how "accepted" it is to echo out functions?

Consider two functions:

function does_return() {
   return 'foo';
}

function does_echo() {
   echo 'bar';
}

does_return();      // nothing displayed
echo does_return(); // 'foo' displayed

does_echo();        // 'bar' displayed
echo does_echo();   // 'bar' displayed

In both cases, output CAN be performed, but how it happens differs. Since does_return() does not itself have ANY code to perform output within its definition, output is up to the calling code, e.g. the echo you perform.

With does_echo(), it doesn't matter how you call the function (with or without echo), since the function does the output itself. you'll get bar regardless.

Now consider this:

function this_is_fun();
    echo 'foo';
    return 'bar';
}

this_is_fun();       // outputs 'foo'
echo this_is_fun();  // outputs 'foobar';

I don't see how it's bad practice. As long as you're reusing the function, then it seems like you're using it the right way.

The only thing you shouldn't be doing is using global; rather pass $post to the function. See this answer for why.

Since your function already has an output, you don't need the echo.

my_function( $post );

That's fine. I'd rather see that than the PHP mixed in completely to the HTML.

You can use <?= my_function() ?> instead if you want to write a little less code.

Functions are supposed to return data, and then your application deals with it how you wish, whether that’s assigning it to a variable or echoing it out.

What @DaveRandom said in his comment. Aside from that, no, it's not necessarily bad practice. It can though make for code that's hard to debug. Consider a MVC approach instead where the logic is largely in the Controller and the View simply handles rendering the view based on that logic.

This is bad practice, because it makes your code hard to maintain.

With a function like that you are mixing the logic and presentation. So, when you see something in your output that you don't like you can not be sure where to go first to go and change it. Do you go to the page code or the function code?