ホームページ > バックエンド開発 > PHPチュートリアル > PHPでparent::を使用するには?

PHPでparent::を使用するには?

伊谢尔伦
リリース: 2023-03-13 08:10:02
オリジナル
9202 人が閲覧しました

PHP では、同じクラス内の同じ名前のメソッドを含め、同じ名前の関数を定義することはできないため、メソッドのオーバーロードはありません。親クラスと同じ名前のメソッドは、サブクラスに単独で定義できます。これは、親クラスのメソッドがサブクラスにすでに存在しているため、親クラスから継承したメソッドをサブクラスでオーバーライドできるためです。

親クラスをサブクラスでオーバーライドする方法は、親クラスから継承したメソッドをサブクラスで上書きするというものですが、親クラスのメソッドをサブクラスで継承するとそのまま使用できないのでしょうか?なぜ過負荷にする必要があるのでしょうか?カバーしなければならない状況がいくつかあるからです。たとえば、「Bird」クラスがあり、このクラスには鳥の一般的なメソッド「Fly」が定義されています。 「ostrich」クラスをサブクラスにすると「flying」メソッドが継承されますが、「ostrich」クラスの「flying」メソッドを呼び出すとすぐにダチョウは飛び去ってしまいます。ダチョウは飛べませんが、他の特性は「鳥」の特性を持っています。そのため、「ダチョウ」クラスを宣言する場合でも「鳥」クラスを継承できますが、「ダチョウ」クラスに「鳥」クラスを追加する必要があります。 . クラスから継承した「フライング」メソッドを書き換えるには、親クラスのメソッドをサブクラスでオーバーロードする必要があります。

次の例では、宣言された Person クラスに「speak」メソッドがあり、Student クラスが Person クラスを継承すると、「speak」メソッドを直接使用できます。ただし、Person クラスの "speak" メソッドは独自のメンバー 属性 のみを話すことができますが、Student クラスは Person クラスを拡張し、いくつかの新しいメンバー属性を追加します。コードは次のとおりです:

<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人类中声明一个通用的说话方法,介绍一下自己
function say(){
echo "我的名字:".$this-> name.",性别:".$this ->sex.",年龄:".$this ->age."。<br>";
}
}
//声明一个学生类,使用extends关键字扩展(继承)person类
class Student extends Person {
private $school; //在学生类中声明一个所在学校school的成员属性
//覆盖父类中的构造方法,在参数列表中添加一个学校属性,用来创建对象并初始化成员属性
function construct($name="",$sex="男",$age=1,$school=""){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."学习<br>";
}
//定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称
function say(){
echo "我的名字:".$this ->name.",性别:".$this ->sex.",年龄:".$this ->age.",在".$this ->school."学校上学<br>";
}
}
$student= new Student("张三","男",20,"edu"); //创建一个学生对象,并传给一个学校名称参数
$student -> say(); //调用学生类中覆盖父类的说话方法
?>
ログイン後にコピー

変更したプログラムを実行した後の出力結果は次のとおりです:

私の名前: Zhang San、性別: 男性、年齢: 20 歳、教育学校で勉強しています

PHPでは、サブクラスのオーバーロードされたメソッド内で、親クラスのオーバーライドされたメソッドを呼び出す機能が提供されています。このように、サブクラスによってオーバーライドされたメソッドでは、親クラスから継承されてオーバーライドされたメソッドを引き続き使用し、必要に応じて新しい関数を追加できます。呼び出しの形式は、「親:メソッド名」を使用して、親クラスのオーバーライドされたメソッドをサブクラスのオーバーロードされたメソッドで呼び出します。上記の例のコードを変更し、サブクラスのオーバーライドされたコンストラクターで「parent::construct()」を使用して親クラスのオーバーライドされたコンストラクターを呼び出し、サブクラスの新しく拡張されたメンバーのメンバー属性を追加します。コード。サブクラスでオーバーライドされたsay()メソッドの「parent::say()」を使用して、親クラスでオーバーライドされたsay()メソッドを呼び出し、サブクラスのメンバー属性を出力する機能を追加します。

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

<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人类中声明一个通用的说话方法,介绍一下自己
function say(){
echo "我的名字:".$this-> name.",性别:".$this ->sex.",年龄:".$this ->age."。<br>";
}
}
//声明一个学生类,使用extends关键字扩展(继承)person类
class Student extends Person {
private $school; //在学生类中声明一个所在学校school的成员属性
//覆盖父类中的构造方法,在参数列表中添加一个学校属性,用来创建对象并初始化成员属性
function construct($name="",$sex="男",$age=1,$school=""){
//调用父类中被覆盖的构造方法,为从父类中集成过来额出行赋初值
parent::construct($name,$sex,$age);
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."学习<br>";
}
//定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称
function say(){
parent::say(); //调用父类中被本方法覆盖掉的方法
echo "在".$this ->school."学校上学<br>";
}
}
$student= new Student("张三","男",20,"edu"); //创建一个学生对象,并传给一个学校名称参数
$student -> say(); //调用学生类中覆盖父类的说话方法
?>
ログイン後にコピー

上記の例の出力結果は前の例と同じですが、この場合、親クラスでオーバーライドされたメソッドをサブクラスで直接呼び出す方がはるかに簡単です。また、サブクラスが親クラスのメソッドをオーバーライドする場合、サブクラスでオーバーライドされるメソッドのアクセス権限が、親クラスのオーバーライドされるメソッドのアクセス権限よりも低くてはいけないことに注意する必要があります。たとえば、親クラスのアクセス権限が保護されている場合、子クラスでオーバーライドされるメソッドの権限は保護またはパブリックにする必要があります。

以上がPHPでparent::を使用するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート