アクセスを制限することに加えて、アクセス メソッドは、サブクラスによって呼び出されるメソッド、またはサブクラスによってアクセスされる属性も決定します。また、関数呼び出しと関数自体の関係、およびメンバー アクセスと関数間の関係も決定されます。変数メモリアドレスはバインディングと呼ばれます
コンピュータ言語には主に静的バインディングと動的バインディングの2つがあり、静的バインディングはプログラムの実行前にデータ構造間で行われるため、ランタイム情報を利用することができません。 PHP は動的言語であるため、静的バインディングをシミュレートできます。
動的バインディングは、実行時に生成されたアクセス要求に対して実行時に利用可能な情報のみを使用します。 オブジェクト指向コードでは、動的バインディングは、どのメソッドが呼び出されるか、またはどのプロパティにアクセスされるかを決定することが、アクセス スコープに基づくのではなく、クラス自体に基づいて行われることを意味します。
Public メンバーと protected メンバーのアクションは、動的バインディングを使用する、PHP の以前のバージョンの関数のアクションに似ています。つまり、メソッドがサブクラスでオーバーライドされ、サブクラスのインスタンスであるクラス メンバーにアクセスする場合、 (親クラスのメンバーにアクセスする代わりに) サブクラスのメンバーにアクセスします。
図 1 を見てください。このコードは「Hey! I am Son」を出力します。PHP が getSalutation を呼び出すと、これは Son のインスタンスであり、挨拶がパブリックである場合、PHP は同じ結果を生成します。オーバーライドされたメソッドの動作は、Son では非常によく似ており、identify の呼び出しはそのメソッドにバインドされています。
サブクラスでアクセスメソッドをprotectedからpublicに弱めたとしても、アクセスメソッドを使用する原理上、クラスメンバーへのアクセス制限を強化することは不可能なので、アクセスメソッドをpublicから変更します。保護することは不可能です。動的バインディング
<?php
クラスのお父さん
{
protected $salutation = "こんにちは!" //こんにちは
;
パブリック関数 getSalutation()
{
print("$this->挨拶
");
$this->identify();
}
保護された関数identify()
{
print(「私は父です。
");
}
};
クラスの息子が父親を拡張します
{
protected $salutation = "Hey!" //親クラスの protected $salutation は上書きされます
;
protected functionidentify() //親クラスの protectedidentify() は上書きされます
{
print(「私は息子です。
");
}
};
$obj = 新しい息子 ();
$obj->getSalutation(); //出力 こんにちは!
?>
//注意: getSalutation() はサブクラスでオーバーライドされませんが、このクラスには $salutation() とidentify() がまだ存在します
。
//Son サブクラスのインスタンスの getSalutation() メソッドに動的にバインドされるため、Son インスタンスの getSalutation() メソッドが呼び出されます。
//親クラスのメンバー salutation とidentify()の代わりに、Sonクラスのメンバーsalutationとidentify()が呼び出されます。
に適用されます。
バインドメンバーとプライベートメンバー
http://www.bkjia.com/PHPjc/486526.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/486526.html