ホームページ >php教程 >php手册 >PHP オブジェクト指向ガイド (8) 新しいメソッドのオーバーロード

PHP オブジェクト指向ガイド (8) 新しいメソッドのオーバーロード

WBOY
WBOYオリジナル
2016-06-13 12:21:421205ブラウズ

12. 新しいメソッドをオーバーロードする
PHP を学習すると、いわゆるメソッドのオーバーロードとは、
同じメソッド名を異なる「数」で定義することを意味します。パラメータ」または異なる「パラメータのタイプ」を使用して、同じメソッド
名の異なるメソッドにアクセスします。ただし、PHP は弱い型付け言語であるため、メソッド自体のパラメーターでさまざまな種類のデータを受け取ることができ、PHP メソッドは無限の数のパラメーターを受け取ることができるため、さまざまな数のパラメーターを渡すことで呼び出すことができます。 >メソッド名が異なる異なるメソッドも無効です。したがって、PHP にはメソッドのオーバーロードはありません。オーバーロードすることはできません。つまり、プロジェクト内で同じメソッド名のメソッドを定義することはできません。また、PHP には名前部分空間の概念がないため、同じページ
とインクルードされたページに同じ名前のメソッドを定義したり、PHP が提供するメソッドと同じ名前で定義したりすることはできません。 course
同じクラス内に同じ名前のメソッドを定義することはできません。
ここで新しいメソッドをオーバーロードするとはどういう意味ですか?実際、新しいメソッドのオーバーロードと呼ばれるものは、サブクラス
が親クラスの既存のメソッドをオーバーライドすることですが、なぜこれを行うのでしょうか?親クラスのメソッドを継承して直接使用することはできないのでしょうか?ただし、
カバーしなければならない状況がいくつかあります。たとえば、先ほど説明した例では、人間「person」
には「speak」メソッドがあり、「person」クラスを継承するすべてのメソッドがあります。サブクラスは「話す」ことができます。「Student」
クラスは「person」クラスのサブクラスであるため、「Student」のインスタンスは「話す」ことができますが、人間は「
の言葉を話す」ことができます。このメソッドは属性を次のように記述します。継承された「say ()」発話メソッドを使用する場合、
から継承された属性のみを発話できます。 " クラスの場合、新しく拡張された属性は、継承された "say()"
メソッドを使用して話すことはできません。まあ、
が話すために "Student" サブクラスに新しいメソッドを定義したら、どうなるのかと尋ねる人もいます。サブクラス内のすべての属性を伝えるだけでは十分ではないでしょうか?抽象的な観点から言えば、「生徒」が 2 つの異なる「話し方」をすることはできません。
関数、継承されたものは達成できます。 speech」メソッドは使用する機会がない可能性があり、継承されている場合は削除できません。
今回はオーバーレイを使用します。
PHPでは同名のメソッドは定義できませんが、親子関係にある2つのクラスでは、サブクラス
に親クラスと同じ名前のメソッドを定義することができ、メソッドを継承することができます。親クラスがオーバーライドされます。
コード スニペット



コードをコピー

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

< ? "person" クラスを親クラス class person{

//以下は person のメンバー属性です

var $name //その人の名前
var $sex;人の性別
var $age; //人の年齢
//属性名 $name、性別 $sex および年齢 $age
function __construct($) に値を割り当てるコンストラクター パラメーターを定義します。 name, $sex, $age){
$this->name=$name;
$this->age=$age; >}
//この人 話し方、自分の属性を伝える
function Say() {
echo "私の名前は: ".$this->name." 性別: ".$ this->sex. " 私の年齢は: ".$this->age."
"
}
}
class Student extends Person
{
var $school; // 生徒がいる学校の属性
// この生徒の学習方法
functionstudy() {
echo "私の名前は: ".$this->name."私は勉強しています ".$this ->school."Learning
";
}
//これは学習について話すことができるメソッドです。すべての属性を伝え、同じメソッドをオーバーライドします。親クラスの名前
function Say( ) {
echo "私の名前は: ".$this->name." 性別: ".$this->sex." 私の年齢: ". $this->age." 私は
の学校に通っています。".$this->school.".
}
}
?>;

上記の例では、親クラスから継承した「say()」メソッドを「Student」サブクラスに
上書きすることで「メソッド」の拡張を実現しています。
ただし、これを行うことで上で述べた問題は解決しますが、実際の開発では、メソッドを 1 つのコードだけで構成することも、複数のコードで構成することも
できません。たとえば、「person」クラスの「say(」) メソッドはたとえば、
のコードが 100 行ある場合、このメソッドを上書きして元の関数に加えてもう少し追加したい場合は、元の 100 行のコード
を一度書き直して、次の数行を追加する必要があります。上記で拡張されたコードは非常に優れていますが、場合によっては、親クラスのメソッドから元のコードが見えないことがあります
このとき、元のコードをどのように書き換えますか?また、解決策もあります。つまり、サブクラス メソッドで、親クラスでオーバーライドされたメソッドを
呼び出すことができます。つまり、オーバーライドされたメソッドの元の関数を取得し、独自の
関数を追加することができます。サブクラスのメソッドで親クラスのオーバーライドされたメソッドを呼び出すには 2 つのメソッドを使用します。
1 つは、親クラスの「クラス名::」を使用して親クラスのオーバーライドされたメソッドを呼び出す方法です。
1 つは、「parent::」メソッドを使用して親クラスでオーバーライドされたメソッドを呼び出す方法です。
コード スニペット

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


class Student extends Person{
var $school; //生徒がいる学校の属性
//この生徒の学習方法
function review() {
echo "私の名前は: ".$this->name." 私は ".$this->school" で勉強しています。
}
//この学者能力は OK 話すメソッドは、そのすべての属性を伝え、同じ名前で親クラスのメソッドをオーバーライドします。
function Say() {
//親クラスの「クラス名::」を使用して、オーバーライドされたメソッドを呼び出します親クラス ;
// Person::say();
//または、親クラスでオーバーライドされたメソッドを呼び出すには、「parent::」メソッドを使用します。 🎜 >//独自の関数をいくつか追加します
echo "私の年齢は: ".$this->age." 私は ".$this->school." の学校に通っています。
" ;
}
}


これで、2 つの方法で親クラスのオーバーライドされたメソッドにアクセスできるようになりました。ユーザーは、自分が作成したコードが親クラスの変数と関数にアクセスしていることに

気づく可能性があります。これは、サブクラスが非常に洗練されている場合、または親クラスが非常に特殊化されている場合に特に当てはまります
。コード内で親クラスのリテラル名を使用しないでください。代わりに、子
クラスの extends 宣言で指される親クラスの名前を参照する特別な名前parentを使用してください。こうすることで、親クラスの名前を複数の場所で使用することがなくなります。実装中に
継承ツリーを変更する必要がある場合は、クラスの extends 宣言部分を変更するだけです。
同様に、コンストラクターがサブクラスで宣言されていない場合、コンストラクターをサブクラス
で再定義すると、親クラスのコンストラクターもオーバーライドされます。新しいコンストラクターを使用してすべての
プロパティに値を割り当てたい場合は、同じメソッドを使用できます。
コード スニペット


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

class Student extends Person{

var $ school; / /生徒の学校の属性
function __construct($name, $sex, $age, $school){
//親クラスのメソッドを使用して、元の属性に値を割り当てます
parent::__construct( $name, $sex, $age);
$this->school=$school;
}
//この生徒の学習方法
function review() {
echo " 私の名前は: ".$this->name." 私は ".$this->school" で勉強しています。
}
//方法この人は話すことができ、自分の属性を言うことができます
function Say() {
parent::say();
//独自の関数をいくつか追加
echo "私の年齢は次のとおりです: ".$ this- >age."私は ".$this->school" の学校に通っています。


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