📌

phpクラスに関する未経験エンジニア的解釈

2021/09/23に公開

クラスの使われ方

同じ構造を持つオブジェクトを複数個生成するような場面で使う。
クラスは雛形という認識でOK

クラスのインスタンス化

クラスは設計図であり、実態を持っていないため、実際に使う場合はインスタンス化という作業を行う。

$obj = new Person;

このように書くことで、Personクラスをひな形として、オブジェクトを作成することができる。

このとき、newでオブジェクトを作成することをインスタンス化と呼び、生成したオブジェクトのことをインスタンスと呼んだりもする。

関数と変数の呼び名

クラスがインスタンス化されたとき、オブジェクトに入っている変数や関数の呼び方。

  • 変数 → メンバやプロパティ
  • 関数 → メソッド

変数(プロパティ)の宣言方法

  • public → クラス外からもアクセス可能
  • private → 自クラス内からのみアクセス可能
  • protected → 自クラス + 継承先クラスからアクセス可能

の3パターン

$this

例えば

class Person{
  public $name = 'test';
  function nametest(){
    echo '$this->name';
  }
}

このように、自クラス内のプロパティを参照する時に$thisを使う。

厳密にはオブジェクト内のプロパティを参照している。(つまり、インスタンス化された段階での動作?ってことだと思う。)

動的に変化する値を用意したいのであれば、$thisが必要になってくる。

function __construct(){}

function __construct(){}

上記関数は、クラスがインスタンス化される際に自動的に呼び出される関数。

プロパティの初期化処理などをこの中に書いておく。(例えば引数に宣言しておいた変数をおいておくなど。)

オブジェクトからプロパティやメソッドを呼び出す方法

$obj = new Person;
$obj->nametest();
$obj->$name;

のように書く。

チェーンメソッド


class Person{
  function testfunc1() {
    echo 'testfunc1';
    return $this;
  }
  function testfunc2() {
    echo 'testfunc2';
    return $this;
  }
}

$obj = new Person;
$obj->testfunc1()->testfunc2();

メソッド内でthisを返すということは、オブジェクトを返しているのと同じことなので、関数から更に別の関数やプロパティを呼び出すことができる。(obj->something)の形になるため。

staticメソッド

class Person{
static function test(){

}
}

のような書き方をする。

staticメソッド内ではthisを使うことはできない。(thisはオブジェクトごとに変化する動的な存在であるため、静的なメソッドであるstaticメソッドでは使用不可)

また、thisを使っている関数を呼ぶことなどもできない。逆にthisを使っている関数が静的メソッドを呼ぶことはできる。

静的メソッドを呼び出す場合は

Person::test();

のように書く。

自クラス内でstaticメソッドを呼び出す方法は

static::test();

また、インスタンスから呼び出すこともできるが、一般的にはクラスから直接呼び出すことのほうが多い(らしい)

staticプロパティ

staticメソッドのプロパティ版。

public static $NAME = 'bird';

ほか、呼び出し方はstaticメソッドと同じ。

プロパティに関しては定数の宣言方法で登場したconstを用いることも可能。その場合は$を消す。

public const NAME = 'bird';

constは定数であるため上書きできない。上書きされたくない値を設定したい場合はconstを使うと良い。

parent

継承元のプロパティや関数を参照したい場合に使う。

echo parent::$WHERE

selfとstaticの挙動の違い

継承元でselfとstaticが使われている状態で、継承先でそうしたメソッドを参照した場合、継承先でstaticなメソッドやプロパティを上書きしていた場合違う挙動をする。

例えば、

class Test1{
  public static $TEST = 'test';
  function __construct(){
    echo self::$TEST;
    echo static::$TEST;
  }
}

class Test2 extends Test1{
  public static $TEST = 'test2';
}

$obj = new Test1;
echo PHP_EOL;
$obj = new Test2;
echo PHP_EOL;

のように書いたとき、出力結果は

testtest
testtest2

となる。

つまりselfの場合は、自クラスのプロパティやメソッドのみ参照するが、staticの場合は継承先のプロパティやメソッドを参照し、ある場合はそちらが優先されるということ。(あくまで継承先オブジェクトで継承元クラスの処理が実行されるようなケース)

phpデータ型宣言

データ型をつけて厳密な開発が可能。

やる場合は必ず、

<?php declare(strict_types=1);

として、データ型に沿わない実装などをした場合にエラーが出るようにしておく。

<?php declare(strict_types=1);
function test (int $val):void{
  echo $val;
}

echo $test;
test(1);

のようにして、型宣言が可能。

クラス、もしくは関数で利用可能。

$thisをreturnするような場面の場合は、返り値の方としてはselfを指定したりする。また引数として、特定のクラスでインスタンス化されたオブジェクトを受け取りたい場合は(Person $person)のように書いたりする。

https://www.php.net/manual/ja/language.types.declarations.php#language.types.declarations.strict

Discussion