PHP5 のアクセスメソッドでは、クラスメンバーへのアクセスを制限できます。これは PHP5 の新機能ですが、多くのオブジェクト指向言語には以前から存在していました。アクセス メソッドを使用すると、信頼性の高いオブジェクト指向アプリケーションを開発し、再利用可能なオブジェクト指向クラス ライブラリを構築できます。
C++ や Java と同様に、PHP にはパブリック、プライベート、プロテクトの 3 つのアクセス メソッドがあり、アクセス メソッドを指定しない場合は、デフォルトのアクセス メソッドを指定することもできます。静的メンバーは、アクセス メソッドを static キーワードの前に配置します (public static など)。
パブリック メンバーは、クラス外のすべてのコードにアクセスできます。スクリプトを任意の場所で呼び出します。以前のバージョンの PHP では、すべてのメソッドとプロパティがパブリックであったため、オブジェクトは適切に構造化された配列のように見えました。
プライベート メンバーはクラス内でのみ表示されます。プライベート プロパティが存在するクラス メソッドの外でその値を変更したり読み取ったりすることはできません。同様に、同じクラス内のメソッドのみがプライベート メソッドを呼び出すことができ、継承されたサブクラスは親クラスのプライベート メンバーにアクセスできません。
プライベート メンバーには、クラスの任意のメンバーおよびクラスのインスタンスからアクセスできることに注意してください。例 6.8 を見ると、equals メソッドは 2 つのウィジェットを比較します。 == 演算子は同じクラスの 2 つのオブジェクトを比較しますが、この例では、各オブジェクト インスタンスは名前と価格のみを比較します。 equals メソッドが別の Widget インスタンスのプライベート プロパティにアクセスする方法に注目してください。Java と C の両方でこれが可能です。
リスト 6.8 プライベートメンバー
クラスのウィジェット
{
プライベート $name;
プライベート $price;
プライベート $id;
パブリック関数 __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
// 2 つのウィジェットが同じであるかどうかをチェックします public functionquals($widget)
{
return(($this->name == $widget->name)AND ($this->price == $widget->price));
}
}
$w1 = 新しいウィジェット('Cog', 5.00);
$w2 = 新しいウィジェット('Cog', 5.00);
7.00
);
if($w1->等しい($w2))
{
print("w1 と w2 は同じ n");
}
//間違い
if($w1->等しい($w3))
{
print("w1 と w3 は同じ n");
}
//FALSE、== 比較対象に ID が含まれます
if($w1 == $w2) //IDが異なるため等しくない
{
print("w1 と w2 は同じ n");
}
?>
オブジェクト指向プログラミングに慣れていない人は、プライベート メンバーを使用する目的は何なのか疑問に思うかもしれません。この章の冒頭で説明したカプセル化と結合の概念を思い出すかもしれません。プライベート メンバーは、データをカプセル化するのに役立ちます。また、データ構造外のコードが内部プロパティに直接アクセスできない場合は、クラス内で非表示にすることができます。
もちろん、ほとんどのプライベート プロパティは引き続き外部コードで共有できます。解決策は、1 つは get (プロパティの値を取得)、もう 1 つは set (プロパティの値を設定) というパブリック メソッドのペアを使用することです。コンストラクターはプロパティの初期値も受け入れます。これにより、メソッドに渡される値を変更する機会も提供されます。コンストラクターがどのように強制するかにも注意してください。価格を浮動小数点数にします (floadval())。
保護された (保護された) メンバーには、同じクラス内のすべてのメソッドおよび継承されたクラス内のすべてのメソッドからアクセスできます。パブリック プロパティは、サブクラスが特定のプロパティに依存して書き込むことができるため、カプセル化の精神に反します。保護されたメソッドを使用するサブクラスは、その親クラスの構造を十分に認識する必要があります。 。
例 6.9 は例 6.8 から改良されており、Widget の Thing サブクラスが含まれています。 Widget には getName という保護されたメソッドが追加されたことに注意してください。Widget のインスタンスが保護されたメソッドを呼び出そうとすると、エラーが発生します。 $w1->getName() はエラーを生成しますが、サブクラス Thing の getName メソッドはこの protected メソッドを呼び出すことができます。もちろん、この例は単純すぎるため、Widget::getName メソッドが保護されていることを証明できません。実際の状況では、保護されたメソッドを使用するには、オブジェクトの内部構造を理解する必要があります。
リスト 6.9 保護されたメンバーの
クラス ウィジェット
{
プライベート $name;
プライベート $price;
プライベート $id;
パブリック関数 __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
// 2 つのウィジェットが同じかどうかをチェックします
パブリック関数と等しい($widget)
{
return(($this->name == $widget->name)AND($this->price == $widget->price));
保護された関数 getName(
)
{
return($this->name);
}
クラス Thing はウィジェットを拡張し
ます
{
プライベート $color;
パブリック関数 setColor($color)
{
$this->color = $color;
パブリック
関数 getColor()
{
return($this->color);
関数
getName()
{
return(parent::getName());
}
=
新しいウィジェット('Cog', 5.00);
$w2 = 新しいもの('Cog', 5.00);
$w2->setColor('Yellow');
//TRUE (まだ!) 結果は true です。
if($w1->等しい($w2))
{
print("w1 と w2 は同じ n");
}
//print Cog 出力 Cog
print($w2->getName());
?>
サブクラスは親クラスのメソッドをオーバーライドすることでメソッドのアクセス方法を変更できますが、依然としていくつかの制限があります。パブリック クラス メンバーをオーバーライドする場合は、そのサブクラスでもパブリックのままにする必要があります。保護されたメンバーをオーバーライドする場合、プライベート メンバーは保護されたままにすることも、現在のクラスでのみ表示されるようにすることもできます。親クラスのプライベート メンバーと同じ名前のメンバーを宣言すると、現在のクラスに別のメンバーが作成されるだけなので、技術的にはプライベート メンバーをオーバーライドすることはできません。
Final キーワードは、メンバー メソッドへのアクセスを制限するもう 1 つの方法です。サブクラスは、親クラスで Final としてマークされたメソッドをオーバーライドできません。また、属性に Final キーワードを使用することはできません。