getterメソッドとsetterメソッドを持つ、ショートコードの各属性をまとめたクラス

ショートコードの各属性をまとめたクラスについて、PHPソースコードを解説しています。

ショートコードの属性値を取得したり、設定したりするために、以下のメソッドを用意しています。

  • getterメソッド
  • setterメソッド

これらのメソッドを用意するのは、
クラス内にデータを閉じ込めておきたい、という考えによるものです。

getterメソッドとsetterメソッドを持つ、ショートコードの各属性をまとめたShortcodeAttributeクラス

class ShortcodeAttribute {

	private $keyword;

	public function getKeyword() {

		return $this->keyword;
	}

	public function setKeyword($keyword) {

		$this->keyword = $keyword;
	}

以下省略

}

ShortcodeAttributeクラスは、ショートコードの各属性をまとめたクラスです。
主に、データを保持するためのクラスになります。

上記のソースコードは、ショートコードのキーワード属性に関する

  • getterメソッド
  • setterメソッド

になります。

※関連記事:Javaプログラミングで、値を設定する、値を取得するメソッドの名前の付け方

上記のgetterメソッド、setterメソッドでは、単純な処理だけしています。

getKeyword()メソッドでは、キーワード文字列をreturn文で返しているだけです。

setKeyword($keyword)メソッドでは、
引数のキーワード文字列を、
クラス内(オブジェクト内部)のメンバ変数に代入しているだけです。

以上の状況では、getterメソッドやsetterメソッドはなくても良い、と思うかもしれません。

実際のところ、クラス内のメンバ変数をpublic変数にしても、正しく動作するプログラムを書ける、と思います。

メンバ変数$keywordを、public変数にした例

class ShortcodeAttribute {

	public $keyword;

以下省略

クラス内のメンバ変数をpublic変数にしておけば、
getterメソッドやsetterメソッドを省略できるのに、と思うかもしれません。

それでもgetterメソッドやsetterメソッドを用意するのは、

  • クラス内でデータをまとめて管理したい、
  • クラス内にデータを閉じ込めておきたい、

という考えがあるように思います。

クラス内にデータを閉じ込めておくと、デバッグがしやすいです

デバッグ作業において、どんなキーワード文字列が設定されるか(代入されるか)知りたい場合、
setterメソッドのただ1カ所に、ブレークポイントを設定すれば良いです。

なぜなら、キーワード文字列をメンバ変数に代入するソースコードは、setterメソッドのただ1カ所だからです。

その他のソースコードにおいて、代入演算子の = を用いて、キーワード文字列をメンバ変数に代入する箇所がないからです。

ブレークポイント(丸印)を設定する例。

	public function setKeyword($keyword) {

●		$this->keyword = $keyword;
	}

デバッグ作業において、ただ1カ所だけ調べれば良いというのは、作業の負担が軽いと言えます。

自分のプログラミングにおいて、最初にデータをまとめたのは、C言語の構造体だったかも?

上記の文章を書いている時、頭の中に

  • オブジェクト指向のデータのカプセル化
  • typedef structというキーワード

これらが浮かんできました。

自分が過去にやったプログラミングにおいて、最初にデータをまとめたのは、C言語の構造体だったかもしれません。

ずっと昔にプログラミングをやっていたPC-6001のN60 BASICには、構造体はなかったように思います。

ちなみにBASICの命令については、ほとんど忘れてしまいました…。
昔、マイコンBASICマガジンに掲載されていたBASICのプログラムをたくさん打ち込んだのに、ほとんど覚えていません。

参考に、C言語の構造体の宣言は、以下のような感じになります。

strust 構造体の名前 {
    メンバ変数その1;
    メンバ変数その2;
    メンバ変数その3;
}

現在、自分のパソコンにはC言語の開発環境がないため、C言語の構造体についてネットで検索して調べました。

構造体なので、メソッドを持てないようです。
getterメソッドやsetterメソッドが使えないため、データを閉じ込めておきたいという点において、ちょっと不安を感じる仕組みです。

クラスのメンバ変数に対して、型を指定したかったです

class ShortcodeAttribute {
	private $operation;
	private $searchIndex;
	private $keyword;
	private $numberToDisplay;
	private $itemTitleLength;
	private $itemReviewLength;

以下省略

}

上記のコードソースでは、クラスのメンバ変数に対して型を指定していません。

以下のソースコードみたいに、型を指定したかったです。

class ShortcodeAttribute {
	private string $operation;
	private string $searchIndex;
	private string $keyword;
	private int $numberToDisplay;
	private int $itemTitleLength;
	private int $itemReviewLength;

以下省略

}

メンバ変数に対して型の指定をしなかった訳は、プログラミングしていた当時、開発環境Eclipseのエディター画面でエラーが表示されたためです。

たぶん、エラーだったか、警告だったかが、表示されていた気がします。

もしかしたらstringやintではなくて、自作のクラスの型(例:MyInfoClassみたいな型)をメンバ変数に指定した場合に、エラーが表示されていたかもしれません。
すっかり忘れました…。

あと、PHP言語では、クラスのメンバ変数に対して型指定ができないだろう、と思いこんでいました。
これは、私のPHP言語に対する知識不足でした。

PHPの型指定について、ちょっとネットで調べたところ、 PHP 7.4から、クラスのメンバ変数に対して型指定ができるようです。
参考:PHP RFC: Typed Properties 2.0

今後、PHPのソースコードを書く時、クラスのメンバ変数に対して型を指定したい、と思います。

ShortcodeAttribute.phpのソースコード

<?php

namespace goodsmemo\shortcode;

class ShortcodeAttribute {
	private $operation;
	private $searchIndex;
	private $keyword;
	private $numberToDisplay;
	private $itemTitleLength;
	private $itemReviewLength;

	public function getOperation() {

		return $this->operation;
	}

	public function getSearchIndex() {

		return $this->searchIndex;
	}

	public function getKeyword() {

		return $this->keyword;
	}

	public function getNumberToDisplay() {

		return $this->numberToDisplay;
	}

	public function getItemTitleLength() {

		return $this->itemTitleLength;
	}

	public function getItemReviewLength() {

		return $this->itemReviewLength;
	}

	public function setOperation($operation) {

		$this->operation = $operation;
	}

	public function setSearchIndex($searchIndex) {

		$this->searchIndex = $searchIndex;
	}

	public function setKeyword($keyword) {

		$this->keyword = $keyword;
	}

	public function setNumberToDisplay($numberToDisplay) {

		$this->numberToDisplay = $numberToDisplay;
	}

	public function setItemTitleLength($itemTitleLength) {

		$this->itemTitleLength = $itemTitleLength;
	}

	public function setItemReviewLength($itemReviewLength) {

		$this->itemReviewLength = $itemReviewLength;
	}
}