PHPのstaticプロパティとstaticメソッド、定数:Web業界で働くためのPHP入門(15)(3/3 ページ)
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回はクラスの機能として、staticと定数を扱います。
staticメソッド
さて、本筋に戻ってきて、もう1つのstaticメンバである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メソッドと全く同じです。
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))。まとめると以下のようになります。
構文 クラス外からstaticメソッドへのアクセス
クラス名::メソッド()
リスト6の(1)ではstaticメソッドgetRandNum()を使って生成された数値を受け取っています。それを(2)で表示させています。その際、StaticMembersクラスのstaticプロパティである$stNumの値も表示させています。というのは、getRandNum()メソッドは内部で引数を$stNumに加算する処理が含まれているからです(リスト5の(3))。実際、二度目の実行結果である(4)では引数が加算されていることが分かります。
staticメソッドの注意点
さて、プロパティへの加算処理の話が出たところで、リスト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メソッドは普通の関数
ところで、勘の良い人は気付いたかもしれませんが、staticメソッドはその使い方としては普通の関数とほとんど変わりません。リスト5のようにstaticプロパティにアクセスしなければならないような場合であったり、どうしてもクラス内にメソッドとして記述しておかないといけない場合であったりしなければ、staticメソッドとして記述せずに、普通の関数として記述しても問題ありません。
次回は「マジックメソッド」について
次回は「マジックメソッド」と呼ばれる特殊なメソッドを扱います。
今回のサンプルコード
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- WordPress活用に欠かせない、PHPをWindowsにダウンロードしてインストール、アンインストールする
本連載では、さまざまなソフトウェアのインストール、実行するためのセットアップ設定、実行確認、アンインストールの手順を解説する。今回は、PHPとは何か、PHPで動くツールの紹介、PHPのインストールとアンインストールについて解説。PHPプログラミングを始める参考にしてほしい。 - PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ
「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。初回は、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスについて紹介します。 - PHP(スクリプト言語)
PHPは、HTMLへの埋め込みが可能なスクリプト言語(およびその処理系)。主としてWebアプリ開発に使用される。