ホームページ  >  記事  >  バックエンド開発  >  PHP クラスにおけるプライベート属性の継承の問題の分析

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

高洛峰
高洛峰オリジナル
2016-12-01 11:46:171027ブラウズ

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

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

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

プログラムの実行結果:
コードをコピー コードは次のとおりです:
PHP 5.3.8
3000
parent's $sal 3000

If親クラスの属性はサブクラスによってオーバーライドされます。結果はこれです。 5 行目の属性定義が保護されることに注意してください。
コードをコピーする コードは次のとおりです:
class member{
protected $sal=3000;
return $this->sal; }
}

class Manager extends member {
protected $sal=5000;

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

?>

プログラムの実行結果:
コードをコピー コードは次のとおりです:
PHP 5.3.8
5000
parent's $sal 5000

最初の列の親クラス private $sal はオーバーライドされていないため、親クラスのメソッド $manager->getSal() は親クラス自身のプライベート プロパティ $sal を呼び出します。 この時点でメモリには $sal が 2 つあります。
2列目の親クラスのprotected $salはオーバーライドされています $manager->getSal() この親クラスのメソッドは、オーバーライドされた$salを呼び出します 現時点では、親クラスの$salはメモリに存在しません。 、メモリ内には $sal が 1 つだけあります
次に 3 番目の例を見てください
サブクラスでオーバーライドされたメソッドは、現在のプライベートに対して有効です。
コードをコピーする コードは次のとおりです:
private $sal=3000;
public function getSal(){
return $this->sal
}

class Manager extends member {
private $sal=5000;
//書き換えられたメソッド
public function getSal(){
return $this->sal;
}
public function getParentSal(){
//ここで返されるのは、親クラス .
returnparent::getSal();
}
$manager();
echo ".phpversion()."
"; getSal() ;
echo "
";
echo "parent's $sal ".$manager->getParentSal();

コードをコピーする コードは次のとおりです。 .8
5000
parent's $sal 3000

この例では、サブクラスが getSal() メソッドをオーバーライドして、サブクラスのプロパティを呼び出します
サブクラスのこの行をコメント化すると
//private $sal=5000; E:wampwwwoo2-52-5-3.php の 14 行目で、 Notice: Unknown property: Manager::$sal というエラーが見つかります。
12 行目のサブクラス書き換えメソッドをコメントアウトした場合は、 echo $manager-> を実行してください。 ;getSal(); が取得されます。結果は親クラスのプライベート属性 $sal 3000 です。

メモリ内で何が起こっているかを確認するには、zend のデバッグ状態を開きます。下部に $sal が 2 つあることに注意してください。それぞれ 3000 と 5000 です。
コードをコピーする コードは次のとおりです:
private $sal=3000;
public function getSal(){
return $this->sal
}
class Manager extends member {
protected $ sal=5000;
public function getParentSal(){
return $this->sal;
}
$manager = new Manager()."echo $manager->getSal();
?>

プログラムの実行結果:
コードをコピーします。 コードは次のとおりです。
PHP 5.3.8
3000

親クラスの属性 $sal を protected に変更すると、サブクラスは親クラスの属性をオーバーライドします。メモリには $sal が 1 つだけあります。
コードをコピーする コードは次のとおりです:
protected $sal=3000;
public function getSal(){
return $this->sal
}
class Manager extends member {
protected $ sal=5000;
public function getParentSal(){
return $this->sal;
}
$manager = new Manager()."echo $manager->getSal();

?>

プログラムの実行結果:
コードをコピー コードは次のとおりです:
PHP 5.3.8
5000

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

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