phpクラスに関する未経験エンジニア的解釈
クラスの使われ方
同じ構造を持つオブジェクトを複数個生成するような場面で使う。
クラスは雛形という認識で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();
メソッド内で
staticメソッド
class Person{
static function test(){
}
}
のような書き方をする。
staticメソッド内では
また、
静的メソッドを呼び出す場合は
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)のように書いたりする。
Discussion