セクション 9 -- バインディング

WBOY
リリース: 2016-06-13 12:36:55
オリジナル
814 人が閲覧しました

*
---------------------------------------------- ---- ----------------------------------
= この記事は Haohappy によって読まれています< <コア PHP プログラミング>
| = 章のクラスとオブジェクトのメモ
= 不要なトラブルを避けるため、転載しないでください。 🎜>| = ようこそ、私を批判して修正してください。私はすべての PHP 愛好家と一緒に進歩することを願っています。
| = PHP5 研究センター: http://blog.csdn.net/haohappy2004
------ ---------------------------------------------------- --------- ----------------
*/
セクション 9 - バインディング
アクセスを制限することに加えて、アクセス方法もサブクラスがどのメソッドを呼び出すか、またはサブクラスがどの属性にアクセスするかを決定します。関数呼び出しと関数自体の関係、およびメンバー アクセスと変数メモリ アドレスの関係は、バインディングと呼ばれます。
の 2 つがあります。コンピュータ言語における主なバインディング方法 - 静的バインディングと動的バインディングが定義されています。静的バインディングは、プログラムの実行前にデータ構造との間で発生するため、実行時情報を使用できません。関数の本体、または変数とメモリ。PHP は動的言語であるため、静的バインディングをシミュレートできます。
動的バインディングは、実行時に生成されるアクセス要求に対してのみ使用されます。オブジェクト指向コードでは、動的バインディングは、どのメソッドが呼び出されるか、またはどのプロパティがアクセスされるかが、アクセス スコープではなくクラス自体に基づいて決定されることを意味します。関数内の PHP アクションの以前のバージョンと同様に、動的バインディングを使用します。これは、メソッドがサブクラス内でオーバーライドされ、サブクラスのインスタンスであるクラス メンバーにアクセスする場合、(アクセスするのではなく) サブクラスのメンバーにアクセスすることを意味します。
例 6.10 を参照してください。このコードは、PHP が getSalutation を呼び出すと、Father If salutation の挨拶を上書きするため、「Hey! I am Son」を出力します。はい、PHP は、サブクラスでアクセス メソッドが protected から public に弱化された場合でも、メソッドをオーバーライドする操作は非常に似ています。アクセスメソッドを使用する原則に従って、アクセスメソッドを public から protected に変更することはできません。
リスト 6.10 動的バインディング



コードをコピー

コードは次のとおりです: class Father {

protected $salutation = "こんにちは! "; // 挨拶

public function getSalutation()
{
print("$this->salutationn")
$this->identify(); > > protected functionidentify()
{ print("I am Father.
n");
}
};
クラス Son は Father
{
を拡張します$salutation = "Hey!"; // 親クラスの protected $salutation は上書きされます
protected functionidentify() // 親クラスの protectedidentify() は上書きされます
{
print ( "I息子です。
n"); 私は息子です。
?>
//注意: getSalutation() はサブクラスでオーバーライドされませんが、実際にはこのクラス
に $salutation() と Identity() が存在します。// のインスタンスの getSalutation() と同じです。 Son サブクラス ) メソッドは動的にバインドされているため、Son インスタンスの getSalutation() メソッドを呼び出すと、
//
プライベート メンバーは、パブリック メンバーや保護されたメンバーとは異なり、サブクラスがオーバーライドしている場合でも、静的バインディングをシミュレートします。スクリプトは this->salutation を現在のクラス Father にバインドします。
リスト 6.11 バインディングとプライベート メンバー

コードをコピーします コードは次のとおりです。

class Father
{
private $salutation = "こんにちは!"; function getSalutation()
{
print("$this->salutationn");
$this->identify()
} }
プライベート関数identify()
("私は父です。
n");
} }
}
クラス 息子は父を拡張しますプライベート関数identify() $obj- >getSalutation(); /出力 こんにちは。 ! I am Father.
?>
動的バインディングの利点は、親クラスのインターフェースと機能を維持しながら、継承されたクラスがその動作を変更できることです。動的バインディングを使用すると、deleteUser で呼び出される isAuthorized のバージョンは、通常のユーザーの場合、PHP の呼び出しで User::isAuthorized が AuthorizedUser の場合に FALSE を返します。 AuthorizedUser::isAuthorized により、deleteUser がスムーズに実行されます。
//haohappy 注: 一言で説明すると、これは、親の両方に存在するオブジェクトの型、メソッド、および属性のバインディングです。クラスとサブクラス メソッドを呼び出すとき、または属性にアクセスするとき、最初にインスタンスがどのオブジェクト型に属しているかを判断し、次に対応するクラスのメソッドと属性を呼び出します。
リスト 6.12 動的バインディングの利点



コードをコピーします

コードは次のとおりです:

class User
{
protected function isAuthorized() //認証済みユーザーかどうか
return(FALSE); 🎜>
public function getName() // 名前を取得 {
return($this->name)
} ユーザー
{
; return(FALSE);
}
//ユーザーを削除します
print("ユーザーが削除されました。
n");
}
}
class AuthorizedUser extends User // 認証されたユーザー
{
protected function isAuthorized() // isAuthorized をオーバーライドします()
{
return(TRUE);
}
} $user = new User;
$admin = new AuthorizedUser ;
$user- >deleteUser("Zeev");
//authorized
$admin->deleteUser("Zeev");
?> なぜプライベート クラスのメンバーは静的バインディングをシミュレートするのでしょうか?この質問では、なぜプライベート メンバーが必要なのかを思い出す必要があります。保護されたメンバーの代わりにプライベート メンバーを使用するのはどのような場合に意味があるのでしょうか?
プライベート メンバーは、使用したくない場合にのみ使用できます。これは、サブクラスが の動作を継承する場合に使用されます。一般に、優れたオブジェクト階層では、ほとんどの機能がサブクラスによって特殊化されたり、変更されたりすることが可能です。これはオブジェクトの基礎の 1 つです。指向性プログラミング。プライベート メソッドまたは変数は、サブクラスに親クラスの特定の部分を変更させたくない場合など、特定の状況で必要になります。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!