質問: new DateTime('2000-01-01'); $date->add(new DateInterval('P10D')); echo $date->format('Y-m-d') . "\n"; ``` 出力結果。 ``` 2000-01-11 ``` このコードの認識が以下で正しいか教えてください。 **1行目:** Datetimeクラスのインスタンスを生成し$dateに代入。引数の('2000-01-01')は DateTimeクラスのコンストラクタ(DateTime::__construct)に渡している。 **2行目:** $dateオブジェクトのaddメソッドを実行。addメソッドは引数にDateIntervalクラス のインスタンスしか受け付けないので、ここでnew DateIntervalとしてDateInterval クラスのインスタンスを生成して、引数としてaddに渡している。 ('P10D')はDateIntervalオブジェクトのコンストラクタに引数として渡される。 **3行目:** $dateオブジェクトのformatメソッドを実行し、それをechoしている。 **疑問点** **(1)** インスタンスを生成するときに引数がある場合は、その引数はオブジェクトの コンストラクタに渡されるということで正しいでしょうか? **(2)** 2行目のnew DateInterval('P10D')では、ここで生成されたインスタンスを 変数に代入していませんがこの状態でもインスタンスとして使えるのでしょうか? **(3)** またDateInterval::formatのマニュアルによると、Dは 「日、数値、先頭に 0 を含む 2 桁」を意味するようですが、('P10D')のPは何なのでしょうか?なぜインターバルに設定したい数値をPとDで囲うのでしょうか? 大変細かくて申し訳ありませんが、私の理解を助けていただければ嬉しいです。
回答: > > インスタンスを生成するときの引数はオブジェクトのコンストラクタに渡される > > > そのとおりです。クラスを new したときは、そのクラスのコンストラクタ(`DateTime::__construct()`)が呼ばれ、引数もそれに渡されます。 > > 代入していませんがこの状態でもインスタンスとして使える > > > 使えます。たとえば次のコードはどちらも同じ意味ですよね? ``` // コードA $message = 'こんにちは'; print($message); // コードB print('こんにちは'); ``` string 変数を定義して変数に格納してからその変数を print() 関数に渡すのと、string 変数を定義して直接 print() 関数に渡しているだけで、結果は同じです。 変数に代入すると、あとで変更したり、何度も参照したり、はたまたコードが見やすくしたり(一行で書くと長くなってしまうときなど)するのに便利に使えるだけで、特に必要がなければ変数に格納してやる必要はありません。 今回 DateInterval のインスタンスは $date->add するときしか使わないので、直接定義して引数として渡しているのだと思います。 > > Dは「日、数値、先頭に 0 を含む 2 桁」 > > > `DateInterval::format()` や `DateTime::format()` とは書式が異なります。 `DateInterval::__construct()` に渡す間隔を示す文字列(=**間隔指示子**)の書式については PHP: DateInterval::__construct - Manual を見て下さい。 > > ('P10D')のPは何なのでしょうか? > > > まず "10日後" を示すのが `10D` (10 days) です。 つぎに "P" についてですが、実は DateInterval の間隔指示子は ISO 8601 という国際規格に則っています。ここで期間を表現するには頭に `P` (Periodの意味)を開始時に付けるというルールがあります。 ISO 8601 - Wikipedia というわけでルールに従うと10日後を示す間隔指示子は `P10D` となります。