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