アクセスを制限することに加えて、アクセス メソッドは、サブクラスによって呼び出されるメソッド、またはサブクラスによってアクセスされるプロパティも決定します。関数呼び出しと関数自体の関係、およびメンバー アクセスと変数メモリ アドレスの関係も決まります。バインディングといいます。
コンピューター言語のバインディングには、静的バインディングと動的バインディングの 2 つの主なタイプがあります。静的バインディングは、プログラムの実行前にデータ構造とデータ構造の間で発生するため、実行時情報を利用できません。関数呼び出しと関数の本体、または変数とメモリのブロックが対象です。 PHP は動的言語であるため、静的バインディングを使用しません。ただし、静的バインディングはシミュレートできます。
動的バインディングでは、実行時に生成されたアクセス要求について、実行時に利用可能な情報のみが使用されます。オブジェクト指向コードでは、動的バインディングは、どのメソッドが呼び出されるか、またはどのプロパティがアクセスされるかについての決定が、アクセス スコープではなくクラス自体に基づいて行われることを意味します。
public メンバーと protected メンバーのアクションは、動的バインディングを使用する、PHP の以前のバージョンの関数のアクションと似ています。これは、サブクラスでオーバーライドされ、サブクラスのインスタンスであるクラス メンバーにメソッドがアクセスする場合、(親クラスのメンバーにアクセスするのではなく) サブクラス メンバーがアクセスされることを意味します。
例 6.10 を見てください。このコードは「Hey! I am Son」を出力します。これは、PHP が getSalutation を呼び出すと、Father の挨拶が上書きされるため、PHP は同じ Result を生成します。オーバーライドされたメソッドの動作は非常に似ています。 Son では、識別するための呼び出しはそのメソッドにバインドされています。
サブクラス内でアクセスメソッドをprotectedからpublicに弱めたとしても、アクセスメソッドの原理上、クラスメンバのアクセス制限を強化することはできないため、アクセスメソッドをpublicからpublicに変更することになります。保護されている場合は続行できません。
リスト 6.10 動的バインディング 動的バインディング
クラス Father
{
protected $salutation = "こんにちは!" // 挨拶
public function getSalutation();
{
print("$this->salutationn");
$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() メソッドが呼び出されます。
//Son クラスのメンバー salutation とidentify() は、親クラスのメンバー salutation とidentify() の代わりに呼び出されます。プライベート
メンバーは、パブリック メンバーやプロテクト メンバーとは異なり、それらが配置されているクラス内にのみ存在します。静的バインディングをシミュレートします。例 6.11 を参照してください。 「こんにちは! 私は父です。」と出力されます。サブクラスは挨拶文の値を上書きしますが、スクリプトは this->salutation を現在のクラス Father にバインドします。同様の原則がプライベート メソッドidentify() にも適用されます。
リスト 6.11 バインディングとプライベート メンバー
クラス Father
{
private $salutation = "こんにちは!"
;
{
print("$this->salutationn");
$this->identify();
プライベート関数identify(
)
{
print(「私は父です。
n");
}
息子
は父を拡張します
{
private $salutation = "やあ!";
プライベート関数identify()
{
print(「私は息子です。
n");
}
$
obj = 新しい Son();
$obj->getSalutation(); //出力 こんにちは、お父さんです。
?>
動的バインディングの利点は、親クラスのインターフェイスと関数を維持しながら、継承されたクラスが親クラスの動作を変更できることです。例 6.12 を参照してください。 deleteUser はオブジェクトのタイプによって決定できます。通常のユーザーの場合、User::isAuthorized を呼び出す PHP は FALSE を返します。AuthorizedUser のインスタンスの場合、PHP が AuthorizedUser::isAuthorized を呼び出すと、deleteUser がスムーズに実行されます。
//haohappy 注: 一言でわかりやすく言うと、オブジェクトのタイプとメソッド、属性のバインディングです。親クラスとサブクラスの両方に存在するメソッドを呼び出すとき、または属性にアクセスするときは、最初にどのオブジェクト タイプがオブジェクトであるかを決定します。
リスト 6.12 動的バインディング クラスの利点
User
//User
{
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");
?>
プライベート クラスのメンバーが静的バインディングをシミュレートするのはなぜですか? この質問に答えるには、保護されたメンバーの代わりにプライベート メンバーを使用する必要があるの
はなぜでしょうか
?継承するサブクラス 親クラスの動作を変更または特殊化する場合にのみ使用されます。一般的に、優れたオブジェクト階層では、ほとんどの機能をサブクラスによって特殊化、改善、または変更できます。オブジェクト指向プログラミングの基礎。プライベート メソッドまたはプライベート変数は、サブクラスが親クラスの特定の部分を変更することを許可したくない場合など、特定の状況で必要になります。