PHPで来月末を取得

PHPで来月末を取得するときに苦戦しました。
調べるとほいほいでてくるんですがstrtotime関数の+1 monthが安定していないだのなんだので、結構不安だったからです。ちゃんと理屈で自分が納得行くものを利用したいので…。結論としては以下のコードで取得可能です。

<?php
echo date('Y-m-t', strtotime(date('Y-m-01') . '+1 month'));

これを少し解説したコードが以下

<?php
// 翌月の月初を取得
$next_month_unix_time = strtotime(date('Y-m-01') . '+1 month');
echo $next_month_unix_time; // 1546268400
// 取得した時間の月末日を取得
echo date('Y-m-t', $next_month_unix_time); // 2019-01-31

これは2018年12月6日に実行した場合です。最初はなんでこれで月末が帰ってくるのかわからなかったんですが、date(‘Y-m-t’)の’t’を見落としていました。日付フォーマットの’t’は

指定した月の日数。
http://php.net/manual/ja/function.date.php

とあるので、1月なら30が、2月なら28が帰ってきます(うるう年なども考慮されるかと)。
簡単に見えますが、落とし穴たくさんありそうなので、いろいろ試してみました。

PHPでHTML文字列の作成

PHPでHTML文字列を作成するときに困ってしまいました。具体的にはPDFファイルを作成するのにHTMLが必要だったときです。
最初に試した方法は以下のようなもの

<?php
function getHTML() {
$html = "<!DOCTYPE html>";
$html .= "<html lang=\"en\" dir=\"ltr\">";
// どんどんhtmlをつなげていく
// ...
// ...
return $html;
}
echo getHTML();

これだとHTML構造がわかりにくく、HTML構造の変更にも弱いです。
次にヒアドキュメントも試しましたが、今度はPHPの埋め込みがうまくできずいい方法を探していました。
そこでob_start()関数を使うことに。
ob_start

ob_startは標準出力のバッファリングが可能となります。簡単にいうとechoやprintしたものがそのまま出力されずバッファされます。その他<?php ?>タグ以外で書かれたものもバッファするのでそれを利用しました。
obはおそらくoutput bufferingの略でしょうか(違ったら教えてください…)

 

<?php
function getHTML() {
ob_start();
$h1 = "HTMLが作成されたよ!";
?>
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>html文字列作成テスト</title>
</head>
<body>
<h1><?php echo $h1 ?></h1>
</body>
</html>
<?php
$html = ob_get_clean();
return $html;
}
echo getHTML();

こうすることでhtml構造をわかりやすく表示しつつ、変数の埋め込みも可能となりました。PHPでViewを作っているときと同じ感覚で作成できるのではないかと思います。使用方法も簡単で出力をob_start()で始め、ob_get_clean()で閉じますob_get_clean()の戻り値がバッファの内容となります。