セクション 9 結合 [9]

WBOY
リリース: 2016-06-13 12:46:01
オリジナル
1153 人が閲覧しました


アクセスを制限するだけでなく、アクセス メソッドは、サブクラスによって呼び出されるメソッド、またはサブクラスによってアクセスされるプロパティも決定します。また、関数呼び出しと関数自体の間の関係、およびメンバー アクセスと関数間の関係も決定されます。

コンピュータ言語には、静的バインディングと動的バインディングの 2 つのバインド方法があります。静的バインディングは、プログラムが実行される前にデータ構造との間で発生します。 PHP は動的言語であるため、静的バインディングをシミュレートできます。 >
動的バインディングは、実行時に利用可能な情報のみを使用して、実行時に生成されるアクセス要求に対して行われます。オブジェクト指向コードでは、動的バインディングは、どのメソッドが呼び出されるか、またはどのプロパティがアクセスされるかを決定することを意味し、このクラス自体ではありません。

パブリック メンバーと保護されたメンバーは、動的バインディングを使用して、以前のバージョンの PHP の関数と同様に動作します。つまり、メソッドがサブクラスでオーバーライドされたメソッドにアクセスすると、クラス メンバーが書き込まれます。はサブクラスのインスタンスです。(親クラスのメンバーにアクセスする代わりに) サブクラスのメンバーがアクセスされます。

このコードは「Hey! I am Son.」を出力します。 PHP は getSalutation を呼び出します。これは Son のインスタンスであり、salutation が public の場合、PHP は同じ結果を生成します。 Son では、identify の呼び出しがバインドされます。

サブクラス内でアクセスメソッドが protected から public に弱化されても、アクセスメソッドを使用する原則に従って、クラスメンバーへのアクセスを強化することはできません。したがって、アクセス方法を public から protected に変更することは不可能です。

リスト 6.10 動的バインディング
class Father
{
protected $salutation = "こんにちは!" file://greetings

public function getSalutation()
{
print ("$this->salutationn");
$this->identify();

保護関数identify()
{
print("私はFather.
n");
}
};

class Son extends Father
{
protected $salutation = "Hey!"; file://parentクラスの protected $salutation は上書きされます

親クラスの protected functionidentify() file://protectedidentify() は上書きされます
{
print("I am Son.}
};

$obj = new Son();
$obj->getSalutation(); file://output やあ、私は息子です.
?> //注意: getSalutation() はサブクラスでオーバーライドされませんが、実際には getSalutation() がまだ存在します。//このクラスの $salutation およびidentify()
// のインスタンスの getSalutation() と同じです。 Son サブクラス ) メソッドは動的にバインドされているため、Son インスタンスの getSalutation() メソッドを呼び出すと、
// メソッド内のメンバー salutation とidentify() の代わりに、Son クラス内のメンバー salutation とidentify() が呼び出されます。

プライベート メンバーは、そのメンバーが属するクラス内にのみ存在します。パブリック メンバーや保護されたメンバーとは異なり、PHP は、サブクラスであっても、静的バインディングをシミュレートします。例 6.11 を参照してください。スクリプトは this->salutation を現在のクラス Father にバインドします。

リスト 6.11 バインディングとプライベート メンバー
class Father
{
private $salutation = "こんにちは!"

public function getSalutation()
{
print("$this- >salutationn");
$this->identify();
}

プライベート関数identify()
{
print("私は父です。}
}

class Son extends Father
{
private $salutation = "Hey!";
private functionidentify()
{
print("私は息子です。
n")
}
}

$obj = new Son();
$obj->getSalutation (); file:// 出力 こんにちは!
?> 動的バインディングの利点は、親クラスのインターフェイスと機能を維持しながら、継承されたクラスが親クラスの動作を変更できることです。例 6.12 を参照してください。 動的バインディングを使用しているため、deleteUser で呼び出される isAuthorized のバージョンは、通常のユーザーの場合は FALSE を返します。 AuthorizedUser のインスタンス。PHP で AuthorizedUser::isAuthorized を呼び出すと、deleteUser がスムーズに実行されます。 注: わかりやすく一言で言えば、オブジェクトの型、メソッド、および属性のバインディングです。親クラスとサブクラスの両方に存在するメソッド。または、属性にアクセスするときは、まずインスタンスがどのオブジェクト タイプに属しているかを判断し、次に対応するクラスのメソッドと属性を呼び出します。

Listing 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("User selected.
n")
}
}

class AuthorizedUser extends User file://認証されたユーザー
{
保護された関数 isAuthorized() file://overwrite isAuthorized()
{
return(TRUE);

$ user = 新しいユーザー;
$admin = 新しい AuthorizedUser;

//許可されていません
$user->deleteUser("Zeev"); $admin->deleteUser("Zeev");
?> なぜプライベート クラス メンバーは静的バインディングをシミュレートするのでしょうか? この質問に答えるには、プライベート メンバーがどのような場合に必要なのかを思い出す必要があります。

プライベート メンバーは、サブクラスが親クラスの動作を変更または特殊化したくない場合にのみ使用されます。一般的に、このような状況は考えられるよりもまれです。オブジェクト階層では、ほとんどの機能をサブクラスによって特殊化、改善、変更できるようにする必要があります。これは、オブジェクト指向プログラミングの基本の 1 つです。プライベート メソッドや変数が必要であることが確実な場合など、特定の状況があります。サブクラスが親クラスの特定の部分を変更することを許可したくない。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート