晴耕雨読

working in the fields on fine days and reading books on rainy days

OOP in PHP

PHPにおけるオブジェクト指向のまとめ

目次

クラスの定義

  • class というキーワードでクラスを宣言
  • new クラス名() でインスタンスの生成

PHP

class Foo {}

$foo = new Foo();

コンストラクタ、フィールド、メソッド

  • コンストラクタは __construct メソッドに定義する
  • インスタンス変数は $this->インスタンス変数名 で参照
  • メソッドは function メソッド名() で定義
class Point {
    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }

    public function add($other) {
        return new Point($this->x + $other->x, $this->y + $other->y);
    }

    public function __toString() {
        return "(" . $this->x . ", " . $this->y . ")";
    }
}

$p1 = new Point(1, 2);
$p2 = new Point(3, 4);
echo $p1->add($p2);  // => "(4, 6)"

クラスメソッド、クラス変数、クラス定数

  • クラスメソッド(スタティックメソッド)は static キーワードで宣言します
  • クラス変数も static キーワードで宣言します
  • スタティックなプロパティを呼び出すときは、スコープ演算子 :: を使って静的にアクセスします
class User {
    // クラス変数
    public static $userCount = 0;

    // クラスメソッド
    public static function getUserCount() {
        return self::$userCount;
    }

    public function __construct() {
        self::$userCount += 1;
    }
}

new User();
new User();
User::getUserCount(); // => 2
User::$userCount;     // => 2
  • クラス定数の定義は const キーワードを使います
class Math {
    const PI = 3.141592;
}

Math::PI; // => 3.141592

アクセス権

  • publicprivateprotected の3種類あります
  • アクセス権の修飾子を省略した場合は、デフォルトで public になります
class Person {
    public $name; // この行は省略しても、$name は public のままである。
    private $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function aPublicFunction() {}  // 行頭の public は省略可能
    private function aPrivateFunction() {}
}

継承、オーバーライド

  • 継承は class A extends B
  • 同名のメソッドを定義すれば、オーバーライドになる
  • 自クラスは self で参照するのに対して、親クラスは parent で参照する
class Super {
    function foo() {
        print("Superclass's method foo()\n");
    }
}

class Sub extends Super {
    // オーバーライド
    function foo() {
        print("Subclass's method foo()\n");
        parent::foo();
    }
}

$sub = new Sub();
$sub->foo();
// => Subclass's method foo()
// => Superclasss method foo()
  • オーバーライドされたくないメソッドに対しては final キーワードをつけます
class Super {
    final public function foo() {
        // ...
    }
}

抽象クラス

  • 抽象クラスを定義するには abstruct キーワードを使います
abstract class Super {
    public function aFunc() {
        // ...
    }
    abstract public function anAbstractFunc();
}

インターフェース

Javaと同様に、PHPではインターフェースを定義することができます。

  • インターフェースの定義は interface インターフェース名
  • インターフェースの実装は class クラス名 implements インターフェース名
// インターフェースの定義
interface USBInterface {
    // インターフェースで宣言できる変数は、定数のみ
    const USB_VERSION = 3.0;

    // インターフェースで宣言できるメソッドは、名前のみ
    public function connectUSB();
    public function disconnectUSB();
}


class Printer implements USBInterface {
    // インターフェースの実装
    public function connectUSB() {
        // ...
    }
    public function disconnectUSB() {
        // ...
    }
}