プログラミング(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関数は、
- ob_get_contents関数
- 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関数を使えば、こういったループ処理後の結果も返り値として扱うことができます。
あまり使う場面もないかもしれませんが、なかなか便利な使い方です:)