PHP アドバンス

PHP OOP - スタティックメソッド

1. PHPにおけるスタティックメソッド(Static Methods)とは?

static キーワードは、スタティックメソッド(静的メソッド)やプロパティを作成するために使用されます。
スタティックメソッドの最大の特徴は、クラスのインスタンス(オブジェクト)を生成することなく、直接アクセスできる点にあります。

2. スタティックメソッドの宣言

クラス内にスタティックメソッドを追加するには、メソッド定義の前に static キーワードを記述します。

class ClassName {
  public static function staticMethod() {
    echo "Hello World!";
  }
}

3. スタティックメソッドへのアクセス

スタティックメソッドにアクセスするには、クラス名に続けてダブルコロン(::とメソッド名を指定します。

ClassName::staticMethod();

以下の例では、welcome() というスタティックメソッドを宣言しています。その後、クラスをインスタンス化(new)することなく、クラス名、ダブルコロン(::)、そしてメソッド名を使用して直接呼び出しています。

3.1 例:基本的なスタティックメソッドの呼び出し

<?php
class greeting {
  // スタティックメソッドの定義
  public static function welcome() {
    echo "Hello World!";
  }
}

// インスタンス化せずに直接メソッドを呼び出す
greeting::welcome();
?>

次の例では、計算を行う sum() というスタティックメソッドを定義しています。同様にクラス名から直接アクセスして処理を実行しています。

3.2 例:引数を持つスタティックメソッド

<?php
class calc {
  // スタティックメソッド
  public static function sum($x, $y) {
    return $x * $y;
  }
}

// スタティックメソッドの呼び出し
$res = calc::sum(6, 4);
echo $res;
?>

4. スタティックメソッドに関する詳細事項

クラス内には、スタティックメソッドと非スタティックメソッドの両方を混在させることができます。

4.1 同一クラス内からのアクセス

同じクラス内の別のメソッドからスタティックメソッドを呼び出す場合は、self キーワードとダブルコロン(::)を使用します。

<?php
class greeting {
  // スタティックメソッド
  public static function welcome() {
    echo "Hello World!";
  }

  // 非スタティックメソッド(コンストラクタ)
  public function __construct() {
    self::welcome();
  }
}

new greeting();
?>

4.2 他のクラスからのアクセス

スタティックメソッドが public として定義されている場合、他のクラスのメソッドからそのメソッドを呼び出すことができます。

<?php
class A {
  public static function welcome() {
    echo "Hello World!";
  }
}

class B {
  public function message() {
    // クラスAのスタティックメソッドを呼び出し
    A::welcome();
  }
}

$obj = new B();
echo $obj->message();
?>

4.3 継承関係におけるアクセス

子クラスから親クラスのスタティックメソッドを呼び出す場合は、子クラス内で parent キーワードを使用します。このとき、呼び出すスタティックメソッドは public または protected である必要があります。

<?php
class domain {
  protected static function getWebsiteName() {
    return "Volardev.com";
  }
}

class domainW3 extends domain {
  public $websiteName;
  public function __construct() {
    // 親クラスのスタティックメソッドを呼び出し
    $this->websiteName = parent::getWebsiteName();
  }
}

$domainW3 = new domainW3;
echo $domainW3->websiteName;
?>