declare(strict_types=1);
//①関数ベースの古い書き方
date_default_timezone_set('Asia/Tokyo'); //timezoneを日本時間にセット
$vaa = date('Y年m月d日', time()); //time()はdate関数の初期値なので記述不要
echo $vaa. "\n"; //2021年09月03日
//②現在主流のオブジェクト指向の書き方
$vab = new DateTime(); //DateTimeクラス(以下D)のインスタンスを作成
$vab->setTimezone(new DateTimeZone('Asia/Tokyo')); //Dインスタンスからtimezoneを指定
$vab2 = $vab->format('Y年m月d日'); //Dインスタンスから年月日を取得
echo $vab2. "\n"; //2021年09月03日
PHPはバージョン5くらいからオブジェクト指向によるコーディングもできるようになっているようです。
オブジェクト指向の書き方の対極にあるのは、従来の関数ベースの書き方です。
上記①のスクリプトは、従来どおりの関数ベースの書き方です。
timezoneを指定して、date関数を使って現在日時を取得しています。
②は①をオブジェクト指向で書いたものになります。
オブジェクト指向では、まず実行したい処理に関係するクラスを新しく自分で定義するかもともとPHPで用意されている既存のクラスをインスタンス化して使いします。
今回は東京時間での現在時刻を取得したいわけですから、インスタンス名 = new DateTime(); と書いて既存クラスであるDateTimeクラスのインスタンスを作成します。
そしてそのインスタンスからDateTimeクラスのメソッドを実行してtimezoneを指定しています。
最後にまたインスタンスからDateTimeクラスのメソッドを実行して現在日時を取得したら、このスクリプトは終了です。
オブジェクト指向について理解するには、まずはクラスとインスタンスとオブジェクトという言葉の意味を覚える必要があります。
〇クラス
クラスとは、データ処理の設計図のようなもののことです。
料理に例えるのならば、クラスはその料理(処理)のレシピ(設計図)です。
インスタンスとは、クラスを実体化させたもののことです。
クラスがお料理でいうところのレシピだとすれば、インスタンスはそのレシピで作ったお料理そのものということになります。
〇オブジェクト
オブジェクトは、データを抽象化したもののことです。
クラスとインスタンスをまとめたものをオブジェクトと呼ぶらしいです。
オブジェクト指向のプログラミングでは、まずクラスを定義して、そのクラスの中に必要なプロパティやメソッドを定義していきます。
もちろん、DateTimeのような最初からPHPに用意されている既存のクラスを使ってもOKです。
クラスが用意できたら、次はそのクラスをインスタンス化しましょう。
クラス内のプロパティやメソッドにアクセスするには、そのクラスをインスタンス化する必要があります。
クラスをインスタンス化したら、あとはそのインスタンスにアロー演算子を使ってアクセスしたいプロパティやメソッドを呼び出してしたい処理を実行すればOKです。
〇プロパティ
プロパティはオブジェクトに関連付いたデータのことです。
ざっくり言うと、プロパティ≒クラス内の変数または定数みたいな感じです。
またプロパティはメンバ変数とも呼ばれます。
〇メソッド
メソッドは、オブジェクトに関連付いた関数のことです。
ざっくり言うと、メソッド=クラス内に定義した関数みたいな感じです。
またメソッドはメンバ関数とも呼ばれます。
〇アロー演算子
-> のことをアロー演算子と呼びます。
アロー演算子は、左辺に書いたインスタンスから右辺に書いたプロパティやメソッドにアクセスします。
特定のプロパティやメソッドに処理を実行したい場合は、そのプロパティやメソッドをアロー演算子を使ってインスタンスから呼び出す必要があります。
クラス定義について。
declare(strict_types=1);
class Class1 { //Class1という名前のクラスを定義
public string $ca; //str型のプロパティcaの定義
public int $cb; //int型のプロパティcbの定義
public function getCb1() { //パラメータなし
return number_format($this->cb); //cbの値をnumber_formatで処理して返す
}
public function getCb2(string $cba = '円') { //パラメータとデフォルト引数あり
return number_format($this->cb) . $cba; //cbを関数で処理した値に$cbaを連結して返す
}
}
$ca = new Class1(); //class1クラスのインスタンスを作成
$ca->ca = 'グラタン:'; //インスタンスからcaプロパティに値を代入
$ca->cb = 1100; //インスタンスからcbプロパティに値を代入
echo $ca->ca, $ca->cb, "円\n"; //グラタン:1100円
echo $ca->ca, $ca->getCb1(), "円\n"; //グラタン:1,100円
$ca->ca = 'ピザ:'; //インスタンスからcaプロパティに値を代入
$ca->cb = 1400; //インスタンスからcbプロパティに値を代入
echo $ca->ca, $ca->cb, "円\n"; //ピザ:1200円
echo $ca->ca, $ca->getCb2(), "\n"; //ピザ:1,200円
echo $ca->ca, $ca->getCb2('ドル'); //ピザ:1,200ドル
クラス定義とは、自分で新しいクラスを作ることです。
新しいクラスには、自分で好きなようにプロパティやメソッドを定義することができます。
〇クラス宣言の定形
クラス定義の定形は以下のとおりです。
class クラス名 {
アクセス修飾子 データ型 プロパティ名;
アクセス修飾子 function メソッド名(データ型 パラメータ1, ...); {
実行したい処理;
}
}
〇クラスについて
クラス名の頭文字は大文字にするのがコーディング規約のようです。
クラス名では各単語の頭文字を大文字にして、各単語を空白なしで記述します。
〇プロパティについて
プロパティを定義するには、先頭から「①アクセス修飾子」、「②データ型」、「③プロパティ名」の順番で記述していきます。
データ型の指定はあってもなくてもどっちでもErrorは出ませんが、コーディング上の暗黙のルールとしては指定したほうがいいらしいです。
なおデータ型の指定は、PHP6以前のバージョンではそもそもできないようです。
〇メソッドについて
メソッドを定義するには、先頭から「①アクセス修飾子」、「②function」、「③メソッド名」の順番で記述していきます。
メソッド名のコーディング規約は、先頭の単語は小文字で2つ目以降の単語の頭文字はすべて大文字にして、各単語を空白なしで記述します。
メソッドのパラメータは、必要なければ空でもOKです。
またメソッドのパラメータには通常のユーザ定義関数のようにデフォルト引数を記述することも可能です。
メソッドを使用する際は「インスタンス名->実行したいメソッド名()」のように記述します。
メソッド名右辺のパレンティス(丸括弧)には、使用したいパラメータがあればそれを記述します。
なお当たり前ですが、メソッドの実行時にパラメータを指定したとしても、実行したいメソッドにそのパラメータを受け取る変数(パラメータ)が存在しない場合はErrorが出ます。
〇$thisについて
上記スクリプトのメソッド内に出てくる$thisは、クラス宣言時に自動で生成される特殊な変数です。
$thisは自分自身(クラス)を意味しています。
なので return $this->cb; と書くと、「このクラス内にあるcbプロパティの値を返してね」という意味になります。
ちなみにここではまだ出てきていませんが、もしクラス定数やstatic変数を使っておりそれにアクセスしたい場合は、$thisではなくself::を使います。
self::は自クラスを意味しています。
$thisではクラス定数やstatic変数などの静的プロパティにはアクセスできませんが、self::であればそれらに静的プロパティにアクセスすることができます。
〇インスタンス化の定形
インスタンス化の定形は以下のとおりです。
インスタンス名 = new インスタンス化したいクラス名();
インスタンス名の場所は通常の変数宣言と同じように記述してください。
指定したクラスを呼び出して実行するには、ここで定義したインスタンスが常に必要になります。
〇アクセス修飾子
アクセス修飾子はクラス内にプロパティやメソッドを定義する際に必要な要素です。
アクセス修飾子には以下の3種類があります。
public どこからでもアクセス可能。
protected そのクラス自身とそのクラスを継承したクラスからのみアクセス可能。
private 宣言したクラス内からのみアクセス可能。
以上です。