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

PHP クラスにおけるプライベート属性の継承問題の分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:15:07759ブラウズ

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

コードをコピーします コードは次のとおりです:
class従業員{
private $sal=3000;
public function getSal(){
return $ this-> ;sal;
}
}
class Manager extends member {
protected $sal=5000;

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


プログラムの実行結果:


コードをコピー

コードは次のとおりです:
PHP 5.3.8 3000 parent's $sal 3000

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


コードをコピーします

コードは次のとおりです:
クラス従業員{ //private $sal=3000; public function getSal(){
return $ this-> ;sal;
}
}

class Manager extends member {
protected $sal=5000;

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


最初の列の親クラスのプライベート $sal は書き換えられていないため、親クラスのメソッド $manager->getSal() は親クラス独自のメソッドを呼び出しますこのときプライベートプロパティ $sal メモリ内には $sal が 2 つあります
2 列目の親クラスの protected $sal がオーバーライドされます $manager->getSal() この親クラスのメソッドは上書きされた $sal を呼び出します。親クラスの $sal はメモリ内に存在しません。 サブクラス内のオーバーライドされたメソッドは現在のプライベートに対して 1 つだけ存在します。 。

コードを次のようにコピーします。

& & lt ;?
Priving $ SAL = 3000;
Public function getal () {
Ereturn $ This- & gt; class Manager extends member {
private $sal=5000;
//オーバーライドされたメソッド
public function getSal(){
return $this->sal;
}
public function getParentSal(){ //Return は親クラスの private プロパティです。 returnparent::getSal(); } }
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo "
";
echo "parent's $sal ".$manager->getParentSal();

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

PHP 5.3.8
5000
parent's $sal 3000
この例では、サブクラスは getSal() メソッドをオーバーライドするため、呼び出されるのはサブクラスの属性です サブクラスのこの行をコメント化すると / /private $sal=5000;
14 行目で E:wampwwwoo2-52-5-3.php の未定義プロパティ: Manager::$sal というエラーが見つかります
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()"
"; >getSal();
?>


プログラムの実行結果:


コードは次のとおりです:
3000
属性を変更の$sal親クラス protected の場合、サブクラスは親クラスの属性をオーバーライドします。メモリには $sal が 1 つだけあります。


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

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


コードをコピーします:


PHP 5.3.8
50 00


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


http://www.bkjia.com/PHPjc/326161.html
www.bkjia.comtru​​e
http://www.bkjia.com/PHPjc/326161.html

技術記事

親クラスにプライベート プロパティがある場合は、この文をよく読んでください。この場合、親クラスのメソッドは親クラスのプライベート プロパティのみを提供します。 一連の例を通して理解を深めてみましょう...




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