【PHP】クラスの作成方法とpublic、private、protected、$this、__construct関数の使い方
PHPのクラスの作成方法と使い方を紹介します。
また、public、private、protected、$this、__construct関数の使い方を紹介します。
クラス(Class)とは
クラスとは、新しくオブジェクトを作成するための雛形です。
オブジェクトとは、特定の変数は関数を持っている一つのまとまりのことです。
たとえば、Animalというクラスを作成します。
それには動物のあらゆる情報を持たせておくことができます。
意味のあるまとまりにすることで、コードの再利用性が高まったり可読性が上がります。
言葉ではわかりにくいので、以下にて早速作成方法を確認しましょう。
クラスの作り方
<?php
class Animal
{
// プロパティ
public $age;
private $name;
// protected $name;
// コンストラクタ関数
function __construct($age, $name)
{
// それぞれのプロパティに対して格納する
// $this->age、つまりpublic $ageに引数の$ageを代入するという意味
$this->age = $age;
$this->name = $name;
}
// メソッド
// publicが省略されている
function hello() {
echo 'hello, ' . $this->name;
}
private function hello2() {
echo 'hello2, ' . $this->name;
}
}
クラス内の変数部分のことをプロパティ、関数のことをメソッドといいます。
また、特別な関数である、コンストラクタ関数があります。
まずは、作成の手順を確認します。
プロパティ – 変数のアクセス範囲を指定するキーワードを付与する
アクセス範囲を指定するキーワードには、publicとprivateがあります。
publicとすることで、クラスの外から呼び出すことができます。
反対に、privateの場合はクラスの外からは呼び出せません。
メソッドの場合には、publicなどをつけていない場合、publicが省略されていると考えます。
privateの場合はつける必要があります。
protectedの場合は、自クラスか、クラスを継承したクラスでのみアクセスすることができます。
publicとprivateの中間に位置するものです。
$thisについて
$thisは、インスタンス化されたオブジェクトのことを指し示します。
上の場合であれば、$thisはAnimalクラスをインスタンス化した$上の場合であれば、$thisはAnimalクラスをインスタンス化した$monkeyというオブジェクトを指し示します。
<?php
class Animal
{
// プロパティ
public $age;
private $name;
// コンストラクタ関数
function __construct($age, $name)
{
// それぞれのプロパティに対して格納する
// $this->age、つまりpublic $ageに引数の$ageを代入するという意味
$this->age = $age;
$this->name = $name;
}
// メソッド
// publicが省略されている
function hello() {
echo 'hello, ' . $this->name;
return $this;
}
function googNight() {
echo 'Good night, ' . $this->name;
return $this;
}
private function hello2() {
echo 'hello2, ' . $this->name;
}
}
$dog = new Animal('8', 'dog');
$dog->hello()->googNight();
上のように、$thisには、インスタンスオブジェクトを指すので、
$thisをreturnした場合、続けて他のメソッドを呼ぶことができます。
__construct関数について
__construct関数は、newでインスタンス化するとき(オブジェクトを生成するとき)に、PHPによって自動的に呼ばれる関数です。
__construct関数は、引数をとり、その引数をそれぞれのプロパティに対して格納します。
インスタンス化する
<?php
$monkey = new Animal('10','monkey');
echo $monkey->age;
// 10
echo $monkey->name;
// 名前の方はprivateのため、fatal errorが出てアクセスできません。
// メソッドは以下のようにして実行します。
$monkey->hello();
new演算子でオブジェクトを作成することをインスタンス化といいます。
生成したオブジェクト、つまり上の例では$monkeyのことを、インスタンスやインスタンスオブジェクト、オブジェクトといいます。
まずnew演算子でインスタンスオブジェクトを生成するときに、まずはコンストラクタ関数が呼ばれます。
そのとき、引数に指定した文字列が__construct関数に渡ります。
クラスの静的メソッドstaticメソッドについて
<?php
class Animal
{
// プロパティ
public $age;
private $name;
public static $like = 'eating';
static public $dislike = 'cold';
// コンストラクタ関数
function __construct($age, $name)
{
// それぞれのプロパティに対して格納する
// $this->age、つまりpublic $ageに引数の$ageを代入するという意味
$this->age = $age;
$this->name = $name;
}
// メソッド
// publicが省略されている
function hello() {
echo 'hello, ' . $this->name;
static::hi();
}
// static内では$thisが使えない
static function hi() {
// echo 'hi, ' . $this->name;
echo 'hi!';
}
private function hello2() {
echo 'hello2, ' . $this->name;
}
}
$cat = new Animal('4','cat');
Animal::hi(); //一般的にはこのようにして呼び出す
$cat::hi(); //こっちでも呼び出すことは可能
staticメソッドは、クラス自体に登録するメソッドになります。
staticメソッドは、fucntionの前にstaticキーワードを付与することで作成できます。
特徴としては、staticメソッド内では、$thisキーワードを使用することができません。
staticメソッドは、クラス自体に登録するメソッドのため、クラス側でメソッドを保持しているため、
インスタンスオブジェクトを指す$thisが使えないということです。
また呼び出し方も変わり、クラス名::staticメソッドという書き方になります。
また、インスタンスオブジェクトはクラスを継承しているので、オブジェクト名::staticメソッドという形式でも呼び出せます。
メソッド内では、static::静的メソッド名と記述します。
プロパティも静的にできる
<?php
// 次の3つ書き方が可能、constも意味は同じになる
public static $like = 'eating';
public const like2 = 'sleeping';
static public $dislike = 'cold';
echo Animal::$like;
echo static::like2;
//eating
//eating
クラス内で、上のようにpublicやprivateのキーワードとstaticのキーワードはどちらが先でもいいです。
そして、上のように指定することで呼び出すことができます。
constを使う場合は、$マークは不要になります。呼び出すときも不要です。
上書きされたくない場合は、constを使います。
静的メソッドと通常のメソッドの使い分け
静的メソッドを使う場合は、一般的には$thisを使うかどうかで切り分けます。
$thisを使う場合は一般的なメソッドで書く必要があります。
また静的プロパティに関しては、クラスで共通するプロパティになるため、
そのようなオブジェクトごとに値が変化しないプロパティには静的プロパティを使用します。