PHPのstaticプロパティとstaticメソッド、定数Web業界で働くためのPHP入門(15)(3/3 ページ)

» 2018年03月20日 05時00分 公開
前のページへ 1|2|3       

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;
}
リスト5 phplesson/chap15/StaticMembers.php

 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)
リスト6 phplesson/chap15/useStaticMembersMethod.php

 実行結果は以下の通りです。

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です。

図3 エラーの原因

 非static変数$numはインスタンス内に存在するプロパティです。一方、getRandNum()メソッドは、staticですのでクラスに属します。リスト6では、そもそもStaticMembersのインスタンスが存在していないので、$numが存在していません。仮にStaticMembersをnewしてインスタンスを生成したとしても、どのインスタンスの$numにアクセスすればいいのかあいまいです。ですので、staticメソッドから非staticプロパティにはアクセスできないようにしています。

staticメソッドは普通の関数

 ところで、勘の良い人は気付いたかもしれませんが、staticメソッドはその使い方としては普通の関数とほとんど変わりません。リスト5のようにstaticプロパティにアクセスしなければならないような場合であったり、どうしてもクラス内にメソッドとして記述しておかないといけない場合であったりしなければ、staticメソッドとして記述せずに、普通の関数として記述しても問題ありません。

次回は「マジックメソッド」について

 次回は「マジックメソッド」と呼ばれる特殊なメソッドを扱います。

今回のサンプルコード

 今回のサンプルコードはこちらからダウンロードできます。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。