PHPでは、クラスのメンバー変数は*プロパティ*とも呼ばれます。これらの変数はクラス定義の一部であり、クラスインスタンスの状態を表すために使用されます(つまり、クラスの1つのインスタンスを別のインスタンスと区別するため)。実際には、プロパティの読み取りまたは書き込みを特別な方法で処理したい場合がよくあります。たとえば、`label`プロパティに文字列が代入されるたびに、常にトリミングしたい場合があります。このタスクを実行するには、次のコードを使用できます。
$object->label = trim($label);
上記のコードの欠点は、`label`プロパティを設定する可能性のあるコードのあらゆる場所で`trim()`を呼び出す必要があることです。将来的に、`label`プロパティに新しい要件(たとえば、最初の文字を大文字にする必要があるなど)が生じた場合、`label`に値を代入するすべてのコードを再度変更する必要があります。コードの繰り返しはバグにつながり、可能な限り避けたいプラクティスです。
この問題を解決するために、Yiiは*ゲッター*および*セッター*クラスメソッドに基づいてプロパティを定義することをサポートするyii\base\BaseObjectと呼ばれる基本クラスを導入しています。クラスにその機能が必要な場合は、yii\base\BaseObject、または子クラスから拡張する必要があります。
情報: Yiiフレームワークのほぼすべてのコアクラスは、yii\base\BaseObjectまたは子クラスから拡張されます。これは、コアクラスでゲッターまたはセッターが表示されるたびに、プロパティのように使用できることを意味します。
ゲッターメソッドは、名前が`get`で始まるメソッドです。セッターメソッドは`set`で始まります。 `get`または`set`プレフィックスの後の名前は、プロパティの名前を定義します。たとえば、ゲッター`getLabel()`および/またはセッター`setLabel()`は、次のコードに示すように、`label`という名前のプロパティを定義します。
namespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel()
{
return $this->_label;
}
public function setLabel($value)
{
$this->_label = trim($value);
}
}
明確にするために、ゲッターメソッドとセッターメソッドはプロパティ`label`を作成します。この場合、内部的には`_label`という名前のプライベートプロパティを参照します。
ゲッターとセッターで定義されたプロパティは、クラスのメンバー変数のように使用できます。主な違いは、そのようなプロパティが読み取られるときに、対応するゲッターメソッドが呼び出されることです。プロパティに値が代入されると、対応するセッターメソッドが呼び出されます。例えば
// equivalent to $label = $object->getLabel();
$label = $object->label;
// equivalent to $object->setLabel('abc');
$object->label = 'abc';
セッターのないゲッターで定義されたプロパティは*読み取り専用*です。そのようなプロパティに値を代入しようとすると、InvalidCallExceptionが発生します。同様に、ゲッターのないセッターで定義されたプロパティは*書き込み専用*であり、そのようなプロパティを読み取ろうとすると例外が発生します。書き込み専用プロパティを持つことは一般的ではありません。
ゲッターおよびセッターを介して定義されたプロパティには、いくつかの特別なルールと制限があります。
このガイドの冒頭で説明した問題に戻ると、`label` 値が割り当てられるたびに `trim()` を呼び出す代わりに、`trim()` はセッター `setLabel()` 内で呼び出すだけで済みます。また、新しい要件により、ラベルを最初に大文字にする必要がある場合、`setLabel()` メソッドは他のコードに触れることなく迅速に変更できます。1 つの変更が `label` へのすべての割り当てに普遍的に影響します。
タイプミスを見つけましたか、またはこのページの改善が必要だと思いますか?
GitHub で編集する !
コメントするには、サインアップ または ログイン してください。