さて、本筋に戻ってきて、もう1つのstaticメンバであるstaticメソッドを扱っておきましょう。といっても、考え方はプロパティと同じです。
サンプルでみていきましょう。まず、以下のメソッドをStaticMembersクラスに追記してください。なお、(2)の行はコメントアウトしたままにしておいてください。こちらは後述します。
//引数と乱数をもとに数値を生成するメソッド。 public static function getRandNum(int $init): int //(1) { //非staticプロパティに加算。 // $this->num += $init; //(2) //staticプロパティに引数を加算。 self::$stNum += $init; //(3) //1〜100の乱数を発生。 $rand = rand(1, 100); //乱数とプロパティを掛け合わせ、その値を戻り値とする。 $ans = $rand * self::$stNum; return $ans; }
staticメソッドの作り方は、(1)にあるように、functionキーワードの前にstaticを記述するだけで、他は非staticメソッドと全く同じです。
次に、このメソッドを利用する以下のuseStaticMembersMethod.phpを作成し、実行してください。
<?php require_once("StaticMembers.php"); $ans = StaticMembers::getRandNum(20); //(1) print("1回目の結果: ".$ans."(プロパティの値".StaticMembers::$stNum.")"); //(2) $ans = StaticMembers::getRandNum(15); //(3) print("<br>2回目の結果: ".$ans."(プロパティの値".StaticMembers::$stNum.")"); //(4)
実行結果は以下の通りです。
1回目の結果: 780(プロパティの値20) 2回目の結果: 2870(プロパティの値35)
staticメソッドを利用するには、プロパティと同じようにクラス名を使います(リスト6の(1)と(3))。まとめると以下のようになります。
クラス名::メソッド()
リスト6の(1)ではstaticメソッドgetRandNum()を使って生成された数値を受け取っています。それを(2)で表示させています。その際、StaticMembersクラスのstaticプロパティである$stNumの値も表示させています。というのは、getRandNum()メソッドは内部で引数を$stNumに加算する処理が含まれているからです(リスト5の(3))。実際、二度目の実行結果である(4)では引数が加算されていることが分かります。
さて、プロパティへの加算処理の話が出たところで、リスト5の(2)について説明しておきましょう。これは、staticメソッド内で非staticプロパティへアクセスする処理です。ここのコメントアウトを元に戻してuseStaticMembersMethod.phpを実行してみてください。以下のエラーが発生します。
Fatal error: Uncaught Error: Using $this when not in object context in C:\xampp\htdocs\phplesson\chap15\StaticMembers.php:22 Stack trace: #0 C:\xampp\htdocs\phplesson\chap15\useStaticMembersMethod.php(4): StaticMembers::getRandNum(20) #1 {main} thrown in C:\xampp\htdocs\phplesson\chap15\StaticMembers.php on line 22
このエラーの原因を図示したのが、図3です。
非static変数$numはインスタンス内に存在するプロパティです。一方、getRandNum()メソッドは、staticですのでクラスに属します。リスト6では、そもそもStaticMembersのインスタンスが存在していないので、$numが存在していません。仮にStaticMembersをnewしてインスタンスを生成したとしても、どのインスタンスの$numにアクセスすればいいのかあいまいです。ですので、staticメソッドから非staticプロパティにはアクセスできないようにしています。
ところで、勘の良い人は気付いたかもしれませんが、staticメソッドはその使い方としては普通の関数とほとんど変わりません。リスト5のようにstaticプロパティにアクセスしなければならないような場合であったり、どうしてもクラス内にメソッドとして記述しておかないといけない場合であったりしなければ、staticメソッドとして記述せずに、普通の関数として記述しても問題ありません。
次回は「マジックメソッド」と呼ばれる特殊なメソッドを扱います。
Copyright © ITmedia, Inc. All Rights Reserved.