当サイトのリンクにはアフィリエイト広告が含まれています

echoしたパラメータを返り値で扱えるob_start関数の使い方

プログラミング(PHP)でハマることの一つに「返り値(戻り値)の有無」があると思います。

例えば、「echoで出力されたものを変数に入れたいなー」なんて場合。

function lalala() {
  $favorite_song = '春よ来い';
  echo $favorite_song;
}
lalala(); // 実行結果:春よ来い
$my_favorite_song = lalala();
$your_favorite_song = 'さくら';
echo $my_favorite_song.$your_favorite_song; // 実行結果:エラー

コメントの通り、関数ですでにecho(出力)しているので変数に入れることができません。

上記のように自分で定義した関数であれば、「echo」ではなく「return」を使えば解決するんですが、WordPress独自の関数で中身を変更できなかったり、echoを使った方が簡単な場合もあるので、意外とハマるポイントではないでしょうか?

ob_start関数でバッファリングを有効にする

こういった場合の対処法はいくつかあると思いますが、簡単なのは「ob_start関数」を使うことです。

ob_start — 出力のバッファリングを有効にする

この関数は出力のバッファリングをオンにします。 出力のバッファリングを有効にすると、 (ヘッダ以外の) スクリプトからの出力は実際には行われず、 代わりに内部バッファに保存されます。

引用:ob_start

「バッファリングを有効にする」というよくわからない用語が出てきますが、今のところは「出力された値を変数とかでも扱えるようになる」とでも覚えておくと理解しやすいと思います。

ob_start関数の使い方

ob_start関数は、

  1. ob_get_contents関数
  2. ob_end_clean関数

とセットで使います。

(その他にもいくつかセットで使える関数があります)

基本的な使い方は以下の通り。

ob_start(); // バッファリング開始
// 何かを出力
$lalala = ob_get_contents(); // 変数lalalaに出力内容を代入
ob_end_clean(); // バッファリング終了

ob_start関数とob_get_contents関数の間の出力は複数でもOKです。

活用例

この関数の活用例を2つご紹介します。

returnに変更できない場合

  • 他の人が定義した関数
  • WordPress独自の関数

など、関数側で出力命令がある場合は返り値として扱えません。

例えば、WordPressの独自関数であるwp_head関数やwp_footer関数。

これは関数側で出力命令があるので、中身を返り値として扱いたい場合はob_start関数を使います。

ob_start();
wp_head();
wp_footer();
$lalala = ob_get_contents();
ob_end_clean();

ちなみに、WordPressには'echo' => false;のようにオプションで出力を停止できる関数もあるので、一度調べた上でob_start関数を使うことをおすすめします。

ループ処理でreturnが使えない場合

例えば、以下のようなコードがあるとします。

function lalala() {
 $list = [
 'ららら〜',
 'らーらーらー',
 'らーららー',
 'ららーらー'
 ];
 foreach ($list as $lalala) {
$voice = null;
 if($lalala===lalala()) {
 //処理
 $voice = '処理後の結果';
 } elseif($lalala===lalala_2()) {
 //処理
 $voice = '処理後の結果';
 } elseif($lalala===lalala_3()) {
 //処理
 $voice = '処理後の結果';
 } else {
 //処理
 $voice = '処理後の結果';
 }
 echo $voice;
 }
}

returnだとループせずにその場で処理が終わってしまうのでechoで出力しているんですが、これだと返り値として扱うことができません。

しかし、ob_start関数を使えば、こういったループ処理後の結果も返り値として扱うことができます。

あまり使う場面もないかもしれませんが、なかなか便利な使い方です:)


カテゴリー:プログラミング学習

シェフ

このサイト「Fantastech」を運営している人