LoginSignup
3
4

More than 1 year has passed since last update.

PHPのクラス、インスタンス、継承について

Last updated at Posted at 2022-04-11

クラスとは

クラスとは変数、定数、関数をひとまとめにしたものです。

ex)
変数/定数->プロパティ
関数->メソッド

オブジェクト指向

オブジェクト指向とは役割を分けていくイメージです。
例えば漫画のワンピースで例えると、
航海士、医者、船大工、コックなどそれぞれ役割がありますよね。
航海士クラス、医者クラスのようにクラスを分けていくことです。

Rubyの資料ですが、参考にしてみてください。

オブジェクト指向の3大要素

3大要素は下の3つです。

1.カプセル化
メソッドなどを定義した役割を分けることです。

2.継承
クラスや関数を引き継ぐ役割があります。

3.ポリモーフィズム
同じ役割のものでも新しい役割ができていくイメージです。

便利なブログ

わかりやすいブログなので参考にしてください。

クラス書き方

クラスを書いていきます。クラス名は大文字スタートです。

<?php

class Goods{
   
//アクセス修飾子protected(自分で継承したクラス)

 
//変数
private $goods = [];

//関数
function __construct($goods){
    $this->goods = $goods;
}

public function getGoods(){
    echo $this->goods;
}

public function addGoods($item){
    $this->goods .= $item;
}


public static function  getStaticGoods($str) {
    echo $str;
}


}

$instance = new Goods("練習");

var_dump($instance);
//object(Goods)#1 (1) { ["goods":"Goods":private]=> array(0) { } }

echo "<br>";

$instance->getGoods();
echo "<br>";

$instance->addGoods("追加");
echo "<br>";

$instance->getGoods();
echo "<br>";


Goods::getStaticGoods("静的");
echo "<br>";


//object(Goods)#1 (1) { ["goods":"Goods":private]=> string(6) "練習" }
//練習

//練習追加
//静的

thisこのクラスという意味です。thisgoodsクラスを指しています。
->はアロー関数のことで、変数やメソッドを呼び出します。

クラスの中で変数名を定義する時はprivateを使います。外部からアクセスができなくします。
クラスの中でメソッド名を定義する時はpublicを使います。これは一般公開できます。
protectedは自分で継承したクラスのことです。

__constructメソッド引数で受け取った$goodsを代入します。
クラスを初期化する時には__constructor()を使います。

staticにより、静的に関数が使えます。
使い方はクラス名::関数名です。

newクラス名を入れてインスタンス化できます。

継承

継承とは別のクラスを引き継ぐことです。
子クラスが親クラスの機能を継承していきます。子クラスの機能を継承していきます。

<?php

//親クラス
class NewGoods{

public function echoGoods(){
    echo "親クラス";
}

}


//子クラス
class Goods extends NewGoods{   //親クラスを子クラスが継承
   
//アクセス修飾子protected(自分で継承したクラス)

 
//変数
private $goods = [];

//関数
function __construct($goods){
    $this->goods = $goods;
}

public function getGoods(){
    echo $this->goods;
}

public function addGoods($item){
    $this->goods .= $item;
}


public static function  getStaticGoods($str) {
    echo $str;
}


}

$instance = new Goods("練習");


echo "<br>";

$instance->getGoods();
echo "<br>";

//親クラスもメソッド
$instance->echoGoods();
echo "<br>";

$instance->addGoods("追加");
echo "<br>";


Goods::getStaticGoods("静的");
echo "<br>";

//練習
//親クラス

//静的

オーバーライド

オーバーライドとは上書きのことです。

<?php

//親クラス
class NewGoods{

public function echoGoods(){
    echo "親クラス";
}
//オーバーライド
public function getGoods(){
    echo "親の関数";
}

}

//子クラス
class Goods extends NewGoods{   //親クラスを子クラスが継承
   
//アクセス修飾子protected(自分で継承したクラス)

//変数
private $goods = [];

//関数
function __construct($goods){
    $this->goods = $goods;
}

// public function getGoods(){
//     echo $this->goods;
// }

public function addGoods($item){
    $this->goods .= $item;
}


public static function  getStaticGoods($str) {
    echo $str;
}

}

$instance = new Goods("練習");

echo "<br>";

$instance->getGoods();
echo "<br>";

//親クラスもメソッド
$instance->echoGoods();
echo "<br>";

$instance->addGoods("追加");
echo "<br>";

Goods::getStaticGoods("静的");
echo "<br>";

//親の関数
//親クラス

//静的

finalというキーワードがあるのですが、これは子クラスから上書きできないです。

//親クラス
class NewGoods{

public function echoGoods(){
    echo "親クラス";
}
//オーバーライド
public function getGoods(){
    echo "親の関数";
}


}


//子クラス
final class Goods extends NewGoods{   //親クラスを子クラスが継承
   
//アクセス修飾子protected(自分で継承したクラス)

 
//変数
private $goods = [];

//初回
function __construct($goods = null){
    $this->goods = $goods;
}

 final public function getGoods(){
     echo $this->goods;
 }

public function addGoods($item){
    $this->goods .= $item;
}

public static function  getStaticGoods($str) {
    echo $str;
}

}

$instance = new Goods("練習");


echo "<br>";

$instance->getGoods();
echo "<br>";

//親クラスもメソッド
$instance->echoGoods();
echo "<br>";

$instance->addGoods("追加");
echo "<br>";


Goods::getStaticGoods("静的");
echo "<br>";

//練習
//親クラス

//静的

補足

クラスの呼び方
親クラス基底クラスまたはスーパークラスと呼び出す。
子クラス派生クラスまたはサブクラスと呼びます。

抽象(abstract)クラス

抽象クラスとは他のクラスに継承されることが前提としたクラスです。インスタンスを生成することができません。

<?php
//抽象クラス
abstract class AbstractGoods{

    public function echoGoods(){
        echo "親クラス";
    }
//オーバーライド
    abstract public function getGoods();
        
}

//具象クラス
class NewGoods{

public function echoGoods(){
    echo "親クラス";
}
//オーバーライド
public function getGoods(){
    echo "親の関数";
}

}

//子クラス
class Goods extends AbstractGoods{   //親クラスを子クラスが継承
   
//アクセス修飾子protected(自分で継承したクラス)

//変数
private $goods = [];

//初回
function __construct($goods = null){
    $this->goods = $goods;
}

public function getGoods(){
     echo $this->goods;
 }

public function addGoods($item){
    $this->goods .= $item;
}

public static function  getStaticGoods($str) {
    echo $str;
}

}

$instance = new Goods("練習");


echo "<br>";

$instance->getGoods();
echo "<br>";

//親クラスもメソッド
$instance->echoGoods();
echo "<br>";

$instance->addGoods("追加");
echo "<br>";


Goods::getStaticGoods("静的");
echo "<br>";

//練習
//親クラス

//静的

インターフェース

implementsをインターフェースを使う時によく使います。

<?php

//インターフェース
interface  InterfaceGoods{

//     public function echoGoods(){
//         echo "親クラス";
//     }

public function getGoods();
        
}


//インターフェース
interface  NewsInterface{

    //     public function echoGoods(){
    //         echo "親クラス";
    //     }
    
    public function getNews();
            
}


//具象クラス
class NewGoods{

public function echoGoods(){
    echo "親クラス";
}
//オーバーライド
public function getGoods(){
    echo "親の関数";
}

}

//子クラス
class Goods implements GoodsInterface,NewInterface{   //親クラスを子クラスが継承
   
//アクセス修飾子protected(自分で継承したクラス)

 
//変数
private $goods = [];

//初回
function __construct($goods = null){
    $this->goods = $goods;
}

public function getGoods(){
     echo $this->goods;
 }

public function addGoods($item){
    $this->goods .= $item;
}


public static function  getStaticGoods($str) {
    echo $str;
}


}

$instance = new Goods("練習");


echo "<br>";

$instance->getGoods();
echo "<br>";

//親クラスもメソッド
$instance->echoGoods();
echo "<br>";

$instance->addGoods("追加");
echo "<br>";


Goods::getStaticGoods("静的");
echo "<br>";

//練習
//親クラス

//静的

トレイト

traitはいくつかの機能をまとめるためのものです。

<?php

trait GoodsTrait{
    public function getGoods(){
        echo "商品";
    }
}

trait NewsTrait{
    public function  getNews(){
        echo "新しいニュースです";
    }
}

class Goods{

    use GoodsTrait;
    use NewsTrait;

    public function getInformation(){
        echo "クラスです。";
    }

    // public function getNews(){
    //     echo "クラスニュースです。";
    // }

    
}

//呼び出し
$goods = new Goods();

$goods->getInformation();
echo "<br>";
$goods->getGoods();
echo "<br>";
$goods->getNews();
echo "<br>";

//クラスです。
//商品
//新しいニュースです

ちょっと変えてみます。getNewsでクラスのニュースが優先されます。

<?php

trait GoodsTrait{
    public function getGoods(){
        echo "商品";
    }
}

trait NewsTrait{
    public function  getNews(){
        echo "新しいニュースです";
    }
}

class Goods{

    use GoodsTrait;
    use NewsTrait;

    public function getInformation(){
        echo "クラスです。";
    }

     public function getNews(){
         echo "クラスニュースです。";
     }

    
}

//呼び出し
$goods = new Goods();

$goods->getInformation();
echo "<br>";
$goods->getGoods();
echo "<br>";
$goods->getNews();
echo "<br>";


//クラスです。
//商品
//新しいニュースです

クラスと抽象クラスとインターフェースとトレイトを表にまとめる

上の4つを表にまとめてみました。

image.png

引用  https://qiita.com/MiyakeNatsuho/items/f2d42df417f5f56dd541

より詳細に載っています。

参考資料

下の講座を参考にしています。
実際動画の方がわかりやすいので購入してみてください。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4