menu
ホーム > PHPの文法 > 11 クラスとオブジェクト > PHP オブジェクトのメソッド(method)
オブジェクト指向プログラミング

UPDATE:

PHP オブジェクトのメソッド(method)

メソッド

メソッドの設定

メソッド は、オブジェクト に関連付いた関数のことです。オブジェクト自身に関する操作や振る舞いを行います。メソッド にも プロパティ 同様にアクセス権の設定があります。プロパティと同じで、キーワード public/private/protected で表現し、内容も同一です。public の場合は、クラス外からアクセス可能で、private/protected の場合、同クラス内や継承先クラスの メソッド を通してしか メソッド にアクセスできません。メソッド の場合、アクセス修飾子の省略が可能です。省略した場合、public となります。
※プロパティ 省略不可です。

  • public:クラス外からメソッドにアクセス可
  • private:同クラス内の メソッド から メソッド にアクセス可
  • protected:同クラス内と継承先クラスの メソッド から メソッド にアクセス可

簡単な メソッド を定義してコールしてみましょう。 メソッド のアクセス権は public です。

実行結果
おはようございます!

クラスの定義、インスタンス化、メソッドのコールとシンプルな形です。では、次の例では、private/protected のアクセス修飾子を指定した メッド を作成して、その特性を考えてみたいと思います。

実行結果
再生回数は1回です。
再生回数は-1回です。

dvd_player クラス を宣言し、再生回数の プロパティ private $viewCount を作成、この $viewCount の再生回数の増減を行う メソッド increase_cnt() と decrease_cnt() と cnt_change() を定義しています。そして、アクセス修飾子はそれぞれ、 increase_cnt() は public 、 decrease_cnt() は protected 、cnt_change() は private にしてあります。プロパティ $viewCount と、メソッド cnt_change() はアクセス修飾子が private なので、同クラス内の メソッド increase_cnt() と decrease_cnt() を通して操作可能です。メソッド increase_cnt() は、public なので、クラス外から直接アクセス可能で、インスタンス化 $obj = new dvd_player; して、$obj->increase_cnt(); コールすると「再生回数は1回です。」が出力されます。メソッド decrease_cnt() は protected なので、同じクラス内の メソッド か 継承先の メソッド を通してしかアクセスできません。ですので、 $obj->decrease_cnt(); と直接コールするとエラーになります。この例では、派生クラス derivation_dvd_player() を定義して、この クラス の public メソッド increase_cnt() を作成して、この メソッド を通して dvd_player クラス の decrease_cnt() メソッド にアクセスしています。

アクセサー

では プロパティ へのアクセスを メソッド を通して行うように変更し、そのための メソッド を作成しましょう。先程設定した プロパティ のアクセス権を private に変更してクラス外からアクセスできないようにします。ではどのようにアクセスするのかというと、メソッド を使用してアクセスするようにしてみます。プロパティ への値の設定も メソッド を利用してみましょう。$this は インスタンス 自身を示す特別な変数です。$this を使用すると クラス内 の プロパティ や メソッド にアクセスできます。

実行結果
ASUS

set_maker() メソッド で プロパティ に値を設定し、 get_maker() メソッド で プロパティ を呼び出しています。
プロパティ に直接アクセスしようとすると echo $obj->maker; 次のようなエラーが発生します。「PHP Fatal error: Uncaught Error: Cannot access private property」private プロパティ にアクセスできません、という「Fatal error(重大なエラー)」というメッセージです。

では次に、クラス の プロパティ maker はメーカー名として扱いたいので set_makerメソッド は文字列で60文字以内あればセット可能という仕様に変更しましょう。配列やオブジェクトが makerプロパティ に設定されるのは想定外ですからね。

実行結果
メーカー名は文字列で60文字以内にして下さい。

文字列型で60文字以内というフィルタを行っています。条件を満たさない場合は、エラーメッセージを返えします。

これは1つのカプセル化の例です。 プロパティ maker のアクセス権を private に指定し、外部から直接操作させないようにします。その上で、操作するための処理(メソッド)を別途作ります。操作するための メソッド は外部からアクセス可能である必要があるので、 public の設定です。このような実装を一般的に アクセサー(accessor) と呼び、カプセル化のデータ隠蔽という考えに当たります。

  • クラス の プロパティ アクセス権を private にする
  • プロパティ に値を設定するメソッドを setter()
  • プロパティ から値を取得するメソッドを getter()
  • 一般的に setter は「'set' + プロパティ名」、getterは「’get’ + プロパティ名」にする場合が多い
  • setter/getter の アクセス権は、public または protected にする
  • setter には、バリデート(validate)等のフィルタ処理をさせる場合がある
  • プロパティ への操作はすべて アクセサー と通す


タグ(=記事関連ワード)

日付

公開日:2018年3月6日
最終更新日:

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

https://wepicks.net/phpref-oop-method/trackback/

page top