phpクラスにおけるprivate属性継承問題の解析

4690 ワード

この文をよく見てください.親にプライベートな属性がある場合は.では、親のメソッドは、親のプライベート属性にのみサービスされます.
以下、一連の列により理解を深める.
この例は奇妙に見えますが、サブクラスで属性$salが再定義されていますが、システムは親の属性を返します.
 
  

class employee{
private $sal=3000;
//protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;

public function getParentSal(){
// private .
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();
echo "
";
echo "parent's \$sal ".$manager->getParentSal();
?>

プログラムの実行結果:
 
  
PHP 5.3.8
3000
parent's $sal 3000

親の属性がクラスに書き換えられた場合.結果はこうでした.注意5行目の属性定義はprotectedになります.
 
  

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

class Manager extends employee {
protected $sal=5000;

public function getParentSal(){
// private .
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();
echo "
";
echo "parent's \$sal ".$manager->getParentSal();

?>

プログラムの実行結果:
 
  
PHP 5.3.8
5000
parent's $sal 5000

最初のカラムの親のprivate$salは書き換えられていないので、$manager->getSal()という親のメソッドは、親自身のプライベート属性$salを呼び出します.このときメモリに2つの$salがあります.
2番目のカラムの親のprotected$salは書き換えられます$manager->getSal()この親のメソッドは書き換えられた$sal親の$salを呼び出しますメモリには存在しませんこのときメモリには$salが1つしかありません
3番目の列を見てみましょう
サブクラスで書き換える方法は、現在のprivateに有効です.
 
  

class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}

class Manager extends employee {
private $sal=5000;
//
public function getSal(){
return $this->sal;
}
public function getParentSal(){
// private .
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();
echo "
";
echo "parent's \$sal ".$manager->getParentSal();
?>

実行結果
 
  
PHP 5.3.8
5000
parent's $sal 3000

この列のサブ中子クラスはgetSal()メソッドを書き換えるので、彼が呼び出したのはサブクラスの属性です.
サブクラスのこの行を注釈すると
//private $sal=5000;
間違いが見つかります:Notice:Undefined property:Manager:$sal in E:wampwwwoo2-52-5.php on line 14
12行のサブクラス書き換え方法を注釈した場合、echo$manager->getSal()結果は親のプライベート属性$sal 3000
zendデバッグステータスを開いて、メモリの状況を確認します.一番下には$salが2つあります.それぞれ3000と5000です.
 
  

class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
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つしかありません.
 
  

class employee{
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
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でサブクラスが作成されると、親クラスのプロパティとメソッドがメモリに作成され、コンストラクション関数も呼び出されます.
PHP 5はそうではなく、PHP 5が親を呼び出すのにparent::parentではなく->を使用します.これは、PHP 5がメモリに親を作成したくないことを示しています.PHP 5はJavaよりも継承を簡単にしたい.
慣れればいい.