PHPでクラスを実際にコーディングをしながら学びましょう。
クラス
オブジェクト指向の基礎となるクラスについて記載します。
クラスとはデータ構造でありインスタンス化することによりデータを保持する事が出来ます。
保持したデータを必要とする型へ形成して取得する事が出来ます。
「たいやき」を例にします。
たいやき機(型)=クラス
例(たいやき)
クラス = たいやき機
インスタンス生成 = 生地+あんこを入れる
データ形成 = たいやき
基本
まずは基本的なクラスを書いていきます。
「たいやき」を元に書いてきましょう。
class
/* class */
class taiyaki{
// private変数は外部から参照できない
private $sozai;
// メソッド
function setMenu($anko, $kizi){
// 自クラスのsozai変数へメソッド引数設定
$this->sozai = $anko.$kizi;
}
function getTaiyaki(){
// thisはインスタンス化されたクラスのデータを参照します。
return $this->sozai;
}
}
// クラス生成
// newでクラスのインスタンスを生成します。
$myTaiyaki = new taiyaki();
// メソッドを参照します。
$myTaiyaki->setMenu("anko", "kizi");
print($myTaiyaki->getTaiyaki());
print("<br/>");
function
メソッドを定義します。()の中には引数を定義します。
new
クラスをインスタンス化します。生成とも呼びます。
ヒープ領域(自由に使えるデータ領域)に実態領域を作成します。最初は気にしなくて大丈夫です。
->
->(アロー)を使ってクラスの変数やメソッドを参照する事ができます。
継承
“extends”を使用する事によってクラスを継承する事が出来ます。
インスタンス化した際に継承したクラス(親クラス)を参照する事が出来ます。
extends
/* class */
class taiyaki{
// private変数は外部から参照できない
private $sozai;
// メソッド
function setMenu($anko, $kizi){
// 自クラスのsozai変数へメソッド引数設定
$this->sozai = $anko.$kizi;
}
// メソッド
function getTaiyaki(){
// sozai変数の中身を返す
return $this->sozai;
}
}
/* class (継承 extend) */
// taiyakiクラスを継承
class taiyakiOption extends taiyaki{
private $sp;
private $addSozai;
// コンストラクタはインスタンス時に自動で実行されます
function __construct(){
$sp = "cream";
}
function setSozai($sozai){
$this->addSozai = $sozai;
}
function addSp($sp){
$this->sp = $this->addSozai.$sp;
}
function getTaiyakiSp(){
// sp変数の中身を返す
return $this->sp;
}
}
// 継承クラス生成
// たいやきオプションクラス生成
$myTaiyakiSp = new taiyakiOption();
// 継承したクラスメソッドを参照
$myTaiyakiSp->setMenu("anko", "kizi");
$myTaiyakiSp->setSozai($myTaiyaki->getTaiyaki());
$myTaiyakiSp->addSp("cheese");
print($myTaiyakiSp->getTaiyakiSp());
print("<br/>");
extends
extendsを使用してクラスを継承します。継承したクラスのメソッドや変数を使用する事が出来ます。
ポイント
継承したクラスのメソッドを参照してる事が分かります。
$myTaiyakiSp->setMenu("anko", "kizi");
オーバーライド
オーバーライドとは親クラスのメソッドを子クラスが上書きする事です。
オーバーライド
/* Overwrite */
class testClass1{
public function testFunc(){
print("testA"."<br/>");
}
}
class testClassFinal{
final public function testFunc(){
print("testA"."<br/>");
}
}
class testClass2 extends testClass1{
public function testFunc(){
print("testB"."<br/>");
}
}
class testClass3 extends testClassFinal{
#public function testFunc(){
# print("testB");
# print("<br/>");
#}
}
$temp = new testClass2();
$temp->testFunc();
$temp = new testClass3();
$temp->testFunc();
final
オーバードライブを禁止します。実行すると以下のエラーが表示される。
Fatal error: Cannot override final method testClassFinal::testFunc()
抽象クラス(abstract)
抽象クラスは子クラスへ必ずメソッドを定義しなければなりません。
必要なメソッドをそろえないとエラーが発生します。
abstract
/* 抽象クラス(abstract) */
abstract class getClass{
protected $file;
function __construct($fileName){
$file = $fileName;
}
abstract public function get();
}
class myFile1 extends getClass{
public function get(){
print("myFile");
print($this->file."<br/>");
}
}
class myFile2 extends getClass{
public function get(){
print("file2"."<br/>");
}
}
$myFile = new myFile1("JJ");
$myFile->get();
final
抽象クラスの変数は参照できません。
必要なメソッドをそろえないと以下のエラーが発生します。
Parse error: syntax error, unexpected 'print' (T_PRINT), expecting function (T_FUNCTION) or const (T_CONST)
インタフェース(interface)
インターフェイスはオブジェクト化できない為、実装クラスが必要となります。
抽象クラスとは違い、複数実装できます。実態の定義は出来ません。
interface
/* interface */
interface inputClass{
public function input($in);
}
interface outputClass{
public function output();
}
class myClass implements inputClass, outputClass{
public $inData = "";
public function input($in){
$this->inData = $in;
print($this->inData."<br/>");
}
public function output(){
print($this->inData."<br/>");
}
}
$myfile = new myClass();
$myfile->input("ABC");
$myfile->output();
コンストとスタティック
クラスをインスタンス化せずにコンスト変数、スタティック、スタティックメソッドを使用する。
インスタンス化しない事により、コンストラクタの呼び出しが無くなり高速化され、無駄な領域確保もしないので、スリムな設計になります。ただし、スタティックな領域の為データの初期化など気を付けなければなりません。
const, static
class myData{
// コンストは変更不可
const A = 100;
// スタティックは変更可
public static $B = 200;
public static function put($C, $D){
// 自クラス参照にselfを使用
print(self::A);
print("<br/>");
print(self::$B);
print("<br/>");
print($C.$D);
print("<br/>");
}
}
print(myData::A);
print("<br/>");
print(myData::$B);
print("<br/>");
// 変更可
myData::$B = 201;
print(myData::$B);
print("<br/>");
// スタティックメソッド
myData::put(10, 20);
self
自クラスの値を参照する際に使用します。「this」は使えません!
::
::(スコープ)を使って参照します。「->(アロー)」は使えません!
インスタンス化はヒープ領域にデータ領域を確保します。確保したアドレスを変数へ渡し、アドレス先を参照します。インスタンス化しない場合はスタティック領域にデータ領域が確保されます。
クラスには他にも沢山の機能がありますが、とりあえず基本的な部分に慣れましょう。
お疲れ様でした。