ホームページ >php教程 >php手册 >PHP クラスにおけるプライベート属性の継承の問題の分析

PHP クラスにおけるプライベート属性の継承の問題の分析

WBOY
WBOYオリジナル
2016-06-13 11:56:561044ブラウズ

親クラスにプライベート プロパティがある場合は、この文をよく読んでください。この場合、親クラスのメソッドは親クラスのプライベート プロパティのみを提供します。
以下は理解を深めるための一連の例です。
この例は、サブクラスで属性 $sal が再定義されていますが、システムは親クラスの属性を返します。

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


<
クラス従業員{
private $sal =3000;
//protected $sal=3000;
public function getSal(){
return $this->sal;
}
クラス マネージャーは従業員 {
protected $sal=5000;

public function getParentSal(){
//ここで返されるのは、親クラスの private 属性です。
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal() ;
echo "
";
echo "parent's $sal".$manager->getParentSal();


プログラムの実行結果:



コードをコピーします

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

3000

親の $sal 3000


親クラスの属性がサブクラスによってオーバーライドされる場合。結果はこれです。 5 行目の属性定義が保護されることに注意してください。



コードをコピー

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

クラス従業員{

//private? $sal= 3000;
protected $sal=3000;
public function getSal(){
return $this->sal;

クラスマネージャーextends member {
protected $sal=5000;

public function getParentSal(){
//ここで返されるのは、親クラスの private 属性です。
returnparent::getSal ();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
echo $manager->; getSal();
echo "
";
echo "親の $sal".$manager->getParentSal();


プログラムの実行結果:



コードをコピー

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

PHP 5.3.8 5000 parent's $sal 5000

最初の列の親クラスのプライベート $sal はオーバーライドされていないため、親クラスのメソッド $manager->getSal() は親を呼び出します。この時点でメモリ上にあるクラス自身のプライベートプロパティ $sal $sal が 2 つあります

2 列目で、親クラスの protected $sal がオーバーライドされます $manager->getSal() のメソッドです。親クラスはオーバーライドされた $sal を呼び出します。親クラスの $sal はメモリ内に存在しません。
次に 3 番目の例を見てください。サブクラスでオーバーライドされたメソッドは、現在のプライベートに対して有効です。


コードをコピーします

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


<

クラス従業員{ private $sal =3000; public function getSal(){ return $this->sal; }

class Manager 拡張従業員 {
private $sal=5000 ;
//オーバーライドされたメソッド
public function getSal(){
return $this->sal;
}
public function getParentSal(){
// ここで返されるもの
returnparent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion(); "< ;br>";
echo $manager->getSal();
echo "
";
echo "親の $sal ".$manager->getParentSal();
?>


実行結果



コードをコピー

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


PHP 5.3. 8
5000

親の $sal 3000 この例では、サブクラスが getSal() メソッドをオーバーライドするため、サブクラス この行 //private $sal=5000;

に注釈を付けると、次のエラーが見つかります: Notice: Unknown property: Manager::$sal in E:wampwwwoo2-52-5-3。 php 14 行目

12 行のサブクラス書き換えメソッドをコメントアウトすると、echo $manager->getSal(); の結果は親クラス $sal 3000 のプライベート プロパティになります

Zend デバッグ状態を開いて、メモリ条件を確認します。下部に $sal が 2 つあることに注意してください。それぞれ 3000 と 5000 です。


コードをコピー

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


<
クラス従業員{
private $sal=3000;
public function getSal(){
return $this->sal; >}
クラスマネージャーは従業員を拡張します {
protected $sal=5000;
public function getParentSal(){
return $this->sal;
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal()> 🎜>
プログラムの実行結果:



コードをコピー

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

PHP 5.3.8 3000 親クラスの属性 $sal を protected に変更すると、サブクラスは親クラスの属性をオーバーライドします。メモリには $sal が 1 つだけあります。



コードをコピーします

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

< クラス従業員{ protected $sal? =3000; public function getSal(){ return $this->sal;

}

クラスマネージャーは従業員を拡張します {
protected $sal=5000; >public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager()
echo "PHP ".phpversion()" echo $manager->getSal();

?>


プログラム実行結果:



コードをコピーします

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


PHP 5.3.8
5000

Java を学習したことがある場合は、これはすべて理解するのが難しいと思うでしょう。 Java では、サブクラスが作成されると、親クラスのプロパティとメソッドがメモリ内に作成され、コンストラクターも呼び出されます。 これは PHP5 の場合には当てはまりません。PHP5 は親クラスを呼び出すのにparent:: を使用します。これは、PHP5 が親クラスをメモリ内に作成しないことを示すのに十分です。 PHP5 は Java よりも継承を単純化したいと考えています。

とにかく慣れてください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。