PHP5 のアクセス メソッドを使用すると、クラス メンバーへのアクセスを制限できます。これは PHP5 の新しい機能ですが、アクセス メソッドを使用すると、信頼性の高いオブジェクト指向アプリケーションを開発し、再利用可能なオブジェクトを構築できます。
C++ や Java と同様、PHP には public、private、protected の 3 つのアクセス メソッドがあり、アクセス メソッドを指定しない場合は、デフォルトでそのいずれかになります
。
メソッドはパブリックです。アクセス メソッドを static キーワードの前に置くことで、静的メンバーのアクセス メソッドを指定することもできます。
パブリック メンバーには、制限なくアクセスできます。 . スクリプト内のどこからでもパブリック メソッドを呼び出すことができます。PHP の以前のバージョンでは、すべてのメソッドとプロパティがパブリックであったため、
オブジェクトはクラス内でのみ表示され、値を変更したり読み取ることはできません。同様に、同じクラス内のメソッドのみがプライベート メソッドを呼び出すことができ、親クラス内のメンバー
やインスタンスにはアクセスできないことに注意してください
。クラスはプライベート メンバーにアクセスできます。例 6.8 を参照してください。equals メソッドは 2 つのウィジェットを比較します。== 演算子は同じクラスの 2 つのウィジェットを比較します。この例では、各オブジェクト インスタンスは名前のみを比較します。この操作は、Java と C の両方で可能です
。
クラスウィジェット
{
プライベート $name;
プライベート $price;
プライベート $id;
パブリック関数 __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
// 2 つのウィジェットが同じかどうかを確認します 2 つのウィジェットが同じかどうかを確認します
パブリック関数と等しい($widget)
{
return(($this->name == $widget->name)AND
($this->価格 == $widget->価格));
}
}
$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 (プロパティの値を設定する) です。これにより、メソッドに渡される値を変更する機会も提供されます。例 6.8 では、コンストラクターが価格を強制的に float Number (floadval() にします。 ))
保護されたメンバーは、同じクラスおよび継承されたクラス内のすべてのメソッドからアクセスできます。パブリック プロパティは、サブクラスが依存することを許可するため、カプセル化の精神に違反します。保護されたメソッドに特定の属性を書き込むことによって、この問題が発生することはありません。保護されたメソッドを使用する場合は、その親クラスの構造を明確にする必要があります。
ウィジェットには getName という保護されたメソッドが含まれているため、ウィジェットのインスタンスがその保護されたメソッドを呼び出そうとすると、$w1->getName( というエラーが発生することに注意してください。 ) はエラーを生成しますが、サブクラス Thing の getName メソッドは、この保護されたメソッドを呼び出すことができます。実際の状況では、この例は、保護されたメソッドの使用に依存します。オブジェクトの内部構造を理解すること。
<?php
クラスウィジェット
{
プライベート $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->価格 == $widget->価格));
保護された関数 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 とマークされているメソッドをオーバーライドすることはできません。