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
アクセス権
-
public
とprivate
とprotected
の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() {
// ...
}
}