ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向オーバーロードの新しいメソッド インスタンスの詳細な説明

PHP オブジェクト指向オーバーロードの新しいメソッド インスタンスの詳細な説明

伊谢尔伦
伊谢尔伦オリジナル
2017-07-08 11:32:30997ブラウズ

PHPを学習すると、PHPのメソッドはオーバーロードできないことがわかります。いわゆるメソッドのオーバーロードとは、同じメソッド名を異なる「パラメータの数」または「アクセスするパラメータの型」が異なることで定義することです。同じメソッド名を持つ異なるメソッド。

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


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

<?php 
//定义一个“人”类做为父类 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个
构造方法
参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function construct($name, $sex, $age){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
} 
class Student 
extends
 Person 
{ 
var $school; //学生所在学校的属性 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."我在 
".$this->school."上学.<br>"; 
} 
} 
?>

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


コードは次のとおりです:
class Student extends Person{ 
var $school; //学生所在学校的属性 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法 
function say() { 
//使用父类的“类名::“来调用父类中被覆盖的方法; 
// Person::say(); 
//或者使用“parent::”的方试来调用父类中被覆盖的方法; 
parent::say(); 
//加上一点自己的功能 
echo “我的年龄是:".$this->age."我在".$this->school."上学.<br>"; 
} 
}


さて、親クラスでオーバーライドされたメソッドにアクセスするには 2 つの方法があります。私たちは何を選ぶのですか?ユーザーは次のことを行うことができます


会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非常专业化的时
候尤其是这样。不要用代码中父类文字上的名字,应该用特殊的名字parent,它指的就是子
类在extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继
承树在实现的过程中要修改,只要简单地修改类中extends 声明的部分。
同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类
中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有
属性赋值也可以用同样的方式。
代码片段

代码如下:

class Student extends Person{ 
var $school; //学生所在学校的属性 
function construct($name, $sex, $age, $school){ 
//使用父类中的方法为原有的属性赋值 
parent::construct($name, $sex, $age); 
$this->school=$school; 
} 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
parent::say(); 
//加上一点自己的功能 
echo “我的年龄是:".$this->age."我在".$this->school."上学.<br>";


以上がPHP オブジェクト指向オーバーロードの新しいメソッド インスタンスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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