この記事では、PHP オブジェクト指向サブクラスでの親クラスのオーバーロードについて詳しく説明します。この記事が、PHP サブクラスでの親クラスのオーバーロードを理解するのに役立つことを願っています。
PHP では同じ名前の関数は存在できないため、同じクラス内に同じ名前のメソッドを定義することはできません。ここで言うオーバーロードとは、親クラスと同じ名前のメソッドをサブクラスに定義して、親クラスから継承したメソッドをオーバーライドできることを意味します。
サブクラスでの親クラスのメソッドのオーバーロード
コードは次のとおりです
コードをコピー
クラス人{
public $name;
パブリック関数 __construct($name="" ){
$this->name =$name;
}
public 関数 Say(){
echo "私の名前は".$this->name ;
}
}
?>
クラス学生が 人を拡張します{
public $name;
パブリック関数 __construct($name=""){
$this->name =$name;
}
//ここで親クラスと同じ名前のメソッドを定義し、親クラスのspeakingメソッドを上書きして書き換えます
public 関数 Say(){
echo "私の名前は「.$this->name .」、25 歳です" ;
}
}
?>
メソッドとアクセス権のオーバーライド
サブクラスのオーバーライドされたメソッドは、親クラスのオーバーライドされたメソッドよりも制限的なアクセス許可を使用できません。
親クラスのメソッドのアクセス許可が保護されている場合、サブクラスでオーバーライドされるメソッドのアクセス許可は保護またはパブリックである必要があります。親クラスのメソッドがパブリックの場合、メソッドのアクセス許可はサブクラスでオーバーライドされるのは public のみである必要があります。おそらくこれが、サブクラスが親クラスのプライベート メンバーを継承できるものの、使用できない理由です。
書き換え時のパラメータ数
サブクラスは親クラスとは異なる数のパラメーターを持つことができます。たとえば、次のコンストラクターでは、追加のパラメーター $age が追加されます。
コードは次のとおりです
コードをコピー
クラス Student が person{ を拡張します
️
public $name;
公開 $age;
パブリック関数 __construct($name="",$age=25){
$this->name =$name;
$this->age =$age;
}
パブリック関数say(){
echo "私の名前は「.$this->name .」、今年は「.$this->age.」です。」;
}
?>
コンストラクターのオーバーライド
上記の「書き換え時のパラメータの数」により、サブクラスが親クラスのコンストラクターを書き換えることができるようになりましたが、これは良い書き方ではありません。よく見ると、上記のサブクラス Class Student の書き換えが行われていることがわかります。親クラスの Person コンストラクターの実際には、親クラスのコンストラクター関数にもう 1 つのパラメーターが追加されますが、その後、親クラスの元のパラメーターが書き換えられます。親クラスの Person コンストラクターにはパラメーターが 1 つしかないため、問題なくそれを書き留めるだけです。パラメータが 1 つではなく、複数ある場合、この問題を単純化する方法はあるでしょうか。答えは「はい」です。「親::メソッド名」を使用して、サブクラスのオーバーロードされたメソッドで親クラスのオーバーライドされたメソッドを呼び出すことができます。たとえば、「parent::__construct()」を使用して、親クラスでオーバーライドされたコンストラクター メソッドを呼び出します。他のメソッドも同様であるため、上記のコードは次のように簡略化できます。
コードは次のとおりです
コードをコピー
クラス Student が person{ を拡張します
️ public $name;
公開 $age
パブリック関数 __construct($name="",$age=25){
親::__construct($name,$age);
}
public function Say(){
親::say();
with with with with with with echo "、今年".$this->age .「歳」 ;
}
?>
別の例を見てみましょう
PHP5の書き換え方法
まず親クラスを設定します。この親クラスは「Dog」クラスです。このクラスは犬の特性を記述します。
犬には目が2つあり、走ったり吠えたりすることができます。このように説明するだけです。
私は犬を飼っていますが、犬の特徴に当てはまりますが、違います。
私の子犬には名前があります。私の子犬は小さすぎるので、大声で吠えることができず、鼻歌を歌うことしかできません。
この設計を実装するために継承の概念を使用します。
コードは次のとおりです
コードをコピー
// 犬には目が 2 つあり、吠えることも走ることもできます。
クラス犬{
protected $eyeNumber =2 //属性 ;
// 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber; を返します
}
//犬は吠えることがあります
パブリック関数 yaff(){
「犬ヤフ、ワン ..ワン ..」を返します;
}
//犬は走れます
パブリック関数 run(){
「ドッグラン..ランニング中...」を返します;
}
}
$dog = 新しい犬();
echo "犬には ".$dog->getEyeNumber()" の目があります。 ";
echo $dog->yaff() ." ".$dog->run();
エコー " ";
//これは「犬」と呼ばれる私の子犬です。とても小さいので、吠えることはできません。
class MyDog extends Dog {
プライベート $name = "犬";
パブリック関数 getName(){
$this->name; を返します
}
パブリック関数 yaff(){
$this->name を返します。" yaff, heng...heng ..";
}
}
$myDog = 新しい MyDog();
echo $myDog->getName()." には ".$myDog->getEyeNumber()." の目があります。 ";
echo $myDog->yaff() ." ".$myDog->run();
?>
プログラムの実行結果:
犬には目が2つあります
犬ヤフ、ワン..ワン..
ドッグラン…ランニング…
犬には目が2つあります
犬ヤフ、ヘン...ヘン...
ドッグラン…ランニング…
メソッドとアクセス権のオーバーライド
サブクラスのオーバーライドされたメソッドは、親クラスのオーバーライドされたメソッドよりも制限の厳しいアクセス許可を使用できません。
親クラスがパブリックで、サブクラスがプライベートの場合。
コードは次のとおりです
コードをコピー
// 書き換えられたアクセス権を示すために、dog クラスと mydog クラスを単純化します。
クラス犬{
protected $eyeNumber =2 //属性 ;
// 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber; を返します
}
}
クラス MyDog は Dog { を拡張します
保護された関数 getEyeNumber(){
$this->eyeNumber; を返します
}
}
/*
class MyDog extends Dog {
プライベート関数 getEyeNumber(){
$this->eyeNumber; を返します
}
}
*/
?>
プログラムの実行結果:
致命的なエラー: MyDog::getEyeNumber() へのアクセス レベルは、E:PHPProjectstest.php の 15 行目で public (クラス Dog のように) である必要があります
親クラスが public で、サブクラスが protected の場合。
コードは次のとおりです
コードをコピー
// 書き換えられたアクセス権を示すために、dog クラスと mydog クラスを単純化します。
クラス犬{
protected $eyeNumber =2 //属性 ;
// 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber; を返します
}
}
クラス MyDog は Dog { を拡張します
プライベート関数 getEyeNumber(){
$this->eyeNumber; を返します
}
}
?>
プログラムの実行結果:
致命的なエラー: MyDog::getEyeNumber() へのアクセス レベルは、E:PHPProjectstest.php の 15 行目で public (クラス Dog のように) である必要があります
書き換え時のパラメータ数
サブクラスには、親クラスとは異なる数のパラメータを含めることができます。 (これは Java とは異なり、PHP は弱い型付け言語です。)
コードは次のとおりです
コードをコピー
// オーバーライドされたメソッドのパラメーターを示すために、dog クラスと mydog クラスを簡略化します。
クラス犬{
protected $eyeNumber =2 //属性 ;
// 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber; を返します
}
}
class MyDog extends Dog {
//オーバーライドされたメソッドには、親クラスのメソッドとは異なる数のパラメーターがあります。
パブリック関数 getEyeNumber($eys){
$this->eyeNumber = $eys;
$this->eyeNumber; を返します
}
}
$myDog = 新しい MyDog();
echo "私の犬は ".$myDog->getEyeNumber(3) ." 目を持っています。";
//ハウリングスカイドッグ...はぁ...
//次の文はパラメータ欠落エラーを報告します
//エコー "私の犬は ".$myDog->getEyeNumber() ." 目。";
?>
プログラムの実行結果:
私の犬には目が3つあります。
コンストラクターのオーバーライド
次の例では、親クラスとサブクラスの両方に独自のコンストラクターがあり、サブクラスがインスタンス化されるときに、サブクラスのコンストラクターが呼び出されますが、親クラスのコンストラクターは呼び出されません。最初のセクションと比較してください。 . コンストラクターの継承。
コードは次のとおりです
コードをコピー
//2-2 / extends1.php
//コンストラクターの継承に問題があります。
クラス動物{
パブリック $legNum = 0;
パブリック関数 __construct(){
$this->legNum = 4;
echo "私は動物です ";
}
}
クラス Dog1 は Animal { を拡張します
パブリック関数 __construct(){
$this->legNum = 4;
echo "私は犬です。 ";
}
}
$dog1 = 新しい Dog1();
echo " ";
echo "脚番号は ".$dog1->脚番号;
/*
サブクラスをインスタンス化するときに、コンストラクターが呼び出されます。
*/
?>
プログラムの実行結果:
私は犬です
脚番号は 4 です
注: これは Java とは異なります。Java ではコンストラクターを継承できません。サブクラスがインスタンス化されると、サブクラスのコンストラクターが呼び出され、親クラスのコンストラクターも呼び出されます。
http://www.bkjia.com/PHPjc/632690.html www.bkjia.com true http://www.bkjia.com/PHPjc/632690.html 技術記事 この記事では、PHP オブジェクト指向サブクラスでの親クラスのオーバーロードについて詳しく説明します。この記事が、PHP サブクラスでの親クラスのオーバーロードを理解するのに役立つことを願っています。 PHPでは保存できないので…
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
2024-10-22 09:46:29
2024-10-13 13:53:41
2024-10-12 12:15:51
2024-10-11 22:47:31
2024-10-11 19:36:51
2024-10-11 15:50:41
2024-10-11 15:07:41
2024-10-11 14:21:21
2024-10-11 12:59:11
2024-10-11 12:17:31