ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向ガイド (8) 新しいメソッドのオーバーロード_PHP チュートリアル

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

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

12. 新しいメソッドのオーバーロード
PHP のメソッドをオーバーロードできないことがわかりますが、いわゆるメソッドのオーバーロードとは、同じメソッド名を定義して「異なるパラメータ」または「パラメータ」を渡すことです。 type" が異なるため、異なる名前で同じメソッドにアクセスします。ただし、PHP は弱い型指定言語であるため、メソッドのパラメーターでさまざまな種類のデータを受け取ることができ、PHP メソッドは無限の数のパラメーターを受け取ることができるため、異なる数のパラメーターを渡して呼び出すことはできません。同じメソッド名の異なるメソッドも無効です。したがって、PHP にはメソッドのオーバーロードはありません。オーバーロードすることはできません。つまり、プロジェクト内で同じメソッド名のメソッドを定義することはできません。また、PHP には名前サブスペースの概念がないため、同じページおよびインクルードされたページに同じ名前のメソッドを定義することはできません。また、PHP が提供するメソッドと同じ名前で定義することもできません。同じクラス内に同じ名前のメソッドを定義することはできません。
ここで新しいメソッドをオーバーロードするとはどういう意味ですか?実際、新しいメソッドのオーバーロードと呼ばれるものは、サブクラスが親クラスの既存のメソッドを上書きすることですが、なぜこれを行うのでしょうか?親クラスのメソッドを継承して直接使用することはできないのでしょうか?ただし、カバーしなければならない状況がいくつかあります。たとえば、前述の例では、人間の「person」に「speak」メソッドがあり、「person」クラスを継承するすべてのサブクラスが Can「speak」です。 、「Student」
クラスは「person」クラスのサブクラスであるため、「Student」のインスタンスは「話す」ことができますが、人間の「speak
talk」メソッドは「「person」クラスの属性、および「Student」クラスは「person」クラスを拡張し、いくつかの新しい属性を追加します。継承された「say()」スピーキングメソッドを使用する場合、「person」クラスから継承された属性を除いて、新しく拡張された属性は言うことができません。継承された「say()」メソッドを使用して説明する人もいます。私は「学生」です。「このサブクラスに発話用の新しいメソッドを定義してください。サブクラス内のすべての属性を発話するだけで十分ではないでしょうか?」抽象的な観点から言えば、「生徒」が 2 つの異なる「話し方」を定義したとしても、目的の「話し方」を実現することはできません。継承されたものは使用される機会がない可能性があり、継承されている場合は削除できません。
今回はカバレッジを使用します。
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;学生は位置しています
//この学生 勉強方法
function Study() {
echo "私の名前は: ".$this->name." 私は ".$this->school で勉強しています。"< br>";
}
//これは学習して話すことができるメソッドです。すべての属性を伝え、親クラスの同じ名前のメソッドをカバーします。
function Say() {
echo "私の名前は: ".$this->名前。" 性別: ".$this->性別。" 私の年齢: ".$this->年齢。" 私は
に通っています。".$this->学校。 "学校。
"
}
}

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



コードをコピー

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

class Student extends Person{ var $school; //Attributes学生がいる学校の名前です //この学生はどのように勉強していますかfunction Study() { echo "私の名前は: ".$this->name." 私は ".$this->school で勉強しています" ."
"
}
//このメソッドは、親クラスのメソッドを同じ名前でカバーし、そのすべての属性を伝えます
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); ;
}
//この生徒 勉強方法 functionstudy() { echo "私の名前は: ".$this->name." 私は ".$this->school" で勉強しています。 br>"; } //この人の話し方、自分の属性を伝える
function Say() {
parent::say();
//彼自身の関数をいくつか追加
echo "私の年齢は: ".$this- >age."私は ".$this->school" の学校に通っています。
";





http://www.bkjia.com/PHPjc/320638.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/320638.html

技術記事
12. 新しいメソッドをオーバーロードする PHP を学習すると、いわゆるメソッドのオーバーロードとは、「パラメーターの数」によって同じメソッド名を定義することです。

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