山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

PHP 学習 part. 8

クラスとオブジェクト

オブジェクト指向に関連する内容について学びます。

final

final キーワードをつけてメソッドを宣言するとその派生クラスではそのメソッドのオーバーライドはできません。

<?php

class Book
{
    public $type = "Book";
    public final function getType()
    {
        return $this->type;
    }
}

class Manga extends Book
{
    // オーバーライドできない
    public function getType()
    {

    }
}

抽象クラス

abstract キーワードを使って抽象クラスを定義します。

<?php

abstract class Book
{
    abstract public function getPrice();
}

class MyBook extends Book
{
    public $price = 1000;
    public function __construct()
    {
        
    }
    public function getPrice()
    {
        return $this->price;
    }
}

$book = new MyBook();
echo $book->getPrice();

インターフェース

interface キーワードを使ってインターフェースを定義します。

<?php

interface Hand
{
    public function punch($value);
}

interface Foot
{
    public function kick($value);
}

class AttackMethod implements Hand, Foot
{
    public function punch($x)
    {
        echo $x * 10 . "のダメージ", PHP_EOL;
    }

    public function kick($x)
    {
        echo $x * 30 . "のダメージ", PHP_EOL;
    }
}

$am = new AttackMethod();
$am->punch(5); // 50のダメージ
$am->kick(5); // 150のダメージ

abstract と interface の違いはなんとなく理解はしていますが、使ったことはないですね。

複数のインターフェースを実装するときに同名のメソッドを持たないように注意が必要です。

遅延静的束縛

https://www.php.net/manual/ja/language.oop5.late-static-bindings.php

<?php

class SuperClass
{
    public function helloGateway()
    {
        // self::hello() だと SuperClass が呼ばれる 
        static::hello();
    }

    public static function hello()
    {
        echo __CLASS__, ' hello', PHP_EOL;
    }
}

class Foo extends SuperClass
{
    public static function hello()
    {
        echo __CLASS__, ' hello', PHP_EOL;
    }
}

$foo = new Foo();
$foo->helloGateway();

パーフェクトPHP

パーフェクトPHP