アクセスを制限することに加えて、アクセス メソッドは、サブクラスによって呼び出されるメソッド、またはサブクラスによってアクセスされるプロパティも決定します。関数呼び出しと関数自体の関係、およびメンバー アクセスと変数メモリ アドレスの関係も決まります。
コンピュータ言語ではバインディングと呼ばれます。
バインディングには主に 2 つの方法があります。静的バインディングは、プログラムの実行前にデータ構造とデータ構造の間で行われるため、ランタイムを使用できません。 PHP は、関数呼び出しと関数の本体、またはメモリ内の変数とブロックをターゲットとします。ただし、動的バインディングは、
実行時に生成されるアクセスを
シミュレートできます。リクエストは、実行時に利用可能な情報のみを使用します。動的バインディングは、どのメソッドが呼び出されるか、またはどのプロパティがアクセスされるかが、アクセス スコープではなくクラス自体に基づいて決定されることを意味します
。これは、メソッドがサブクラスでオーバーライドされ、サブクラスのインスタンスであるクラス メンバーにアクセスする場合、(メンバーにアクセスするのではなく) サブクラス メンバーがアクセスされることを意味します。
図 1 を参照してください。
このコードは「Hey! I am Son」を出力します。これは、PHP が getSalutation を呼び出すと、PHP の挨拶が上書きされるためです。 Son では、メソッドをオーバーライドすると、そのメソッドにバインドさ
れ、アクセス モードが protected から public に弱くなり、動的バインディングが発生します。
アクセス メソッドを使用する原則では、クラス メンバーのアクセス制限を強化することはできません。その
ため、アクセス メソッドを public から protected に変更することはできません
。
クラスのお父さん
{
protected $salutation = "こんにちは!" // 挨拶
public function getSalutation();
{
print("$this->挨拶n");
$this->identify();
保護された関数identify(
)
{
print("私は父です。n");
}
息子
は父を拡張します
{
protected $salutation = "Hey!"; //親クラスの protected $salutation は上書きされます
protected functionidentify() //親クラスの protectedidentify() は上書きされます
{
print("私は息子です。n");
}
$obj = 新しい息子()
;
$obj->getSalutation(); //出力 こんにちは!
?>
//注: getSalutation() はサブクラスでオーバーライドされませんが、実際にはこのクラスに $salutation() とidentify() がまだ存在します。
// これらは Son のインスタンスの getSalutation() と同じです。サブクラス このメソッドは動的にバインドされているため、Son インスタンスの getSalutation() メソッドを呼び出すと
、親クラスのメンバー salutation およびidentify() ではなく、Son クラスのメンバー salutation およびidentify() が呼び出されます。プライベート
メンバーのみが存在します
。public メンバーや protected メンバーとは異なり、PHP は静的バインディングをシミュレートします。図 2 の例を参照してください。サブクラスが挨拶の値をオーバーライドしても、「Hello there! I am Father.」が出力されます。スクリプトは this->salutation を現在のクラス Father にバインドします。同様の原則が、プライベート メソッドidentify()
とプライベート メンバー
<?php
に適用されます。
クラスのお父さん
{
private $salutation = "こんにちは!"
;
{
print("$this->挨拶n");
$this->identify();
プライベート関数identify(
)
{
print("私は父です。n");
}
息子
は父を拡張します
{
private $salutation = "やあ!";
プライベート関数identify()
{
print("私は息子です。n");
}
$
obj = 新しい Son();
$obj->getSalutation(); //出力 こんにちは、お父さんです。
?>
動的バインディングの利点は、親クラスのインターフェイスと関数を維持しながら、継承されたクラスが親クラスの動作を変更できることです。例を参照してください。動的バインディングの使用により、isAuthorized のバージョンが呼び出されます。 deleteUser では、オブジェクトのタイプによって決定されます。通常のユーザーの場合、User::isAuthorized を呼び出すと FALSE が返されます。AuthorizedUser のインスタンスの場合、PHP が呼び出すと、deleteUser はスムーズに実行されます
。 haohappy 注: use 一言でわかりやすく言うと、オブジェクトの型とメソッドと属性のバインディングです。親クラスとサブクラスの両方に存在するメソッドを呼び出すとき、または属性にアクセスするときに、まずどのオブジェクトの型を決定します。インスタンスが属するクラスと属性
の
メソッドを呼び出します。<?php
クラス ユーザー //ユーザー
{
protected function isAuthorized() //認証されたユーザーかどうか
{
戻り値(FALSE);
}
public function getName() //名前を取得する
{
return($this->name);
}
public function deleteUser($username) //ユーザーを削除します
{
if(!$this->isAuthorized())
{
print("あなたには権限がありません。n");
戻り値(FALSE);
}
//ユーザーを削除します
print("ユーザーが削除されました。n");
}
}
class AuthorizedUser extends User //認証ユーザー
{
保護された関数 isAuthorized() //isAuthorized() を上書きします
{
戻り値(TRUE);
}
user
= 新しいユーザー;
$admin = new AuthorizedUser
// 権限がありません。
$user->deleteUser("Zeev");
//承認済み
$admin->deleteUser("Zeev");
?>
プライベート クラスのメンバーが静的バインディングをシミュレートするのはなぜですか? この質問に答えるには、保護されたメンバーの代わりにプライベート メンバーを使用する必要があるの
はなぜでしょうか
?継承するサブクラス これは、思っているよりもまれですが、ほとんどの機能をサブクラスによって特殊化、改善、または変更できます。オブジェクト指向プログラミングの基礎。プライベート メソッドまたは変数は、サブクラスに親クラスの特定の部分を変更させたくない場合など、特定の状況で必要になります。