回答:
オーバーロードとは、似たようなシグネチャを持つが、異なるパラメーターを持つ関数を定義することです。オーバーライドは、親クラスがメソッドを定義し、派生クラスがそのメソッドをオーバーライドすることを望む派生クラスにのみ関係します。
PHPでは、マジックメソッドを使用してのみメソッドをオーバーロードできます__call
。
オーバーライドの例:
<?php
class Foo {
function myFoo() {
return "Foo";
}
}
class Bar extends Foo {
function myFoo() {
return "Bar";
}
}
$foo = new Foo;
$bar = new Bar;
echo($foo->myFoo()); //"Foo"
echo($bar->myFoo()); //"Bar"
?>
__call
ます。
異なるパラメーターセットを使用して同じ関数名を2回(またはそれ以上)定義すると、関数のオーバーロードが発生します。例えば:
class Addition {
function compute($first, $second) {
return $first+$second;
}
function compute($first, $second, $third) {
return $first+$second+$third;
}
}
上記の例では、関数compute
は2つの異なるパラメーターシグネチャでオーバーロードされています。*これはPHPではまだサポートされていません。別の方法として、オプションの引数を使用することができます。
class Addition {
function compute($first, $second, $third = 0) {
return $first+$second+$third;
}
}
関数のオーバーライドは、クラスを拡張して親クラスに存在していた関数を書き換えると発生します。
class Substraction extends Addition {
function compute($first, $second, $third = 0) {
return $first-$second-$third;
}
}
たとえば、でcompute
説明されている動作をオーバーライドしますAddition
。
Subtraction
クラスでクラスを拡張する理由がわかりませんAddition
。:)
厳密には、どちらも実行できないため、違いはありません。
関数のオーバーライドは、APDのようなPHP拡張機能を使用して行うことができますが、非推奨であり、以前のバージョンのafaikは使用できませんでした。
PHPでの関数のオーバーロードは動的型付けが原因で実行できません。つまり、PHPでは変数を特定の型に「定義」しません。例:
$a=1;
$a='1';
$a=true;
$a=doSomething();
各変数は異なる型ですが、実行前に型を知ることができます(4番目を参照)。比較として、他の言語は以下を使用します:
int a=1;
String s="1";
bool a=true;
something a=doSomething();
最後の例では、変数の型を強制的に設定する必要があります(例として、データ型「something」を使用しました)。
PHPで関数のオーバーロードができないもう1つの「問題」:PHPには、現在の引数の配列を返すfunc_get_args()という関数があります。次のコードを検討してください。
function hello($a){
print_r(func_get_args());
}
function hello($a,$a){
print_r(func_get_args());
}
hello('a');
hello('a','b');
両方の関数が任意の量の引数を受け入れることを考えると、コンパイラはどちらを選択する必要がありますか?
最後に、上記の返信が部分的に間違っている理由を指摘したいと思います。 関数のオーバーロード/オーバーライドは、メソッドのオーバーロード/オーバーライドと同じではありません。
メソッドが関数のようでクラスに固有である場合、その場合、PHPはクラスでのオーバーライドを許可しますが、言語のセマンティクスにより、オーバーロードは許可しません。
結論として、JavaScriptなどの言語はオーバーライドを許可します(ただし、オーバーロードは許可されません)。ただし、ユーザー関数とメソッドのオーバーライドの違いを示す場合もあります。
/// Function Overriding ///
function a(){
alert('a');
}
a=function(){
alert('b');
}
a(); // shows popup with 'b'
/// Method Overriding ///
var a={
"a":function(){
alert('a');
}
}
a.a=function(){
alert('b');
}
a.a(); // shows popup with 'b'
オーバーロードの例
class overload {
public $name;
public function __construct($agr) {
$this->name = $agr;
}
public function __call($methodname, $agrument) {
if($methodname == 'sum2') {
if(count($agrument) == 2) {
$this->sum($agrument[0], $agrument[1]);
}
if(count($agrument) == 3) {
echo $this->sum1($agrument[0], $agrument[1], $agrument[2]);
}
}
}
public function sum($a, $b) {
return $a + $b;
}
public function sum1($a,$b,$c) {
return $a + $b + $c;
}
}
$object = new overload('Sum');
echo $object->sum2(1,2,3);
オーバーロードのパラダイムはPHPで完全にはサポートされていませんが、同じ(または非常に類似した)効果がデフォルトのパラメーターで実現できます(前述のとおり)。
次のように関数を定義すると、
function f($p=0)
{
if($p)
{
//implement functionality #1 here
}
else
{
//implement functionality #2 here
}
}
この関数を次のように呼び出すと:
f();
1つの機能(#1)が得られますが、次のようなパラメーターを指定して呼び出すと、
f(1);
別の機能を利用できます(#2)。これがオーバーロードの影響です。関数の入力パラメーターに応じて機能が異なります。
私が知っている、誰かがこの関数をf(0)として呼び出すと、どのような機能が得られるかを尋ねるでしょう。
ここで指摘しておきたいのは、PHPでのオーバーロードは他のプログラミング言語と比べてまったく異なる意味を持つということです。多くの人々は、PHPではオーバーロードはサポートされていないと述べ、オーバーロードの従来の定義では、機能が明示的に利用可能ではないと述べています。
ただし、PHPでのオーバーロードの正しい定義は完全に異なります。
PHPでは、オーバーロードとは、__ set()や__get()などの魔法のメソッドを使用してプロパティとメソッドを動的に作成することを指します。これらのオーバーロードメソッドは、アクセスできない、または宣言されていないメソッドまたはプロパティと対話するときに呼び出されます。
PHPマニュアルからのリンクは次のとおりです。http://www.php.net/manual/en/language.oop5.overloading.php
メソッドのオーバーロードは、1つのクラス内のメソッド名は同じであるがパラメーターの数が異なる2つ以上のメソッドで発生します。PHPはメソッドのオーバーロードをサポートしていません。メソッドのオーバーライドとは、2つの異なるクラスで同じメソッド名と同じ数のパラメーターを持つ2つのメソッドが、親クラスと子クラスを意味することを意味します。
関数のオーバーロードとオーバーライドには、同じ関数名が含まれていますが、いくつかの違いがあります。オーバーロードでは、同じ名前の関数には、異なるタイプの引数または戻り値のタイプが含まれます。例: "function add(int a、int b)"& " function add(float a、float b);ここではadd()関数がオーバーロードされています。オーバーライドすると、引数と関数名の両方が同じになります。これは通常、継承またはトレイトにあります。導入するためのいくつかの戦略に従う必要があります、どの関数が今すぐ実行されるかを指定します。そのため、プログラマーをオーバーライドする場合は、いくつかの戦術に従って、目的の関数を実行します。
オーバーロード:現実の世界では、オーバーロードとは、誰かに余分なものを割り当てることを意味します。現実世界と同様に、PHPのオーバーロードとは、追加の関数を呼び出すことを意味します。別の方法では、異なるパラメーターを持つよりスリムな関数を持っていると言えます。PHPでは、__ get、__ set、__ callなどのマジック関数でオーバーロードを使用できます。
オーバーロードの例:
class Shape {
const Pi = 3.142 ; // constant value
function __call($functionname, $argument){
if($functionname == 'area')
switch(count($argument)){
case 0 : return 0 ;
case 1 : return self::Pi * $argument[0] ; // 3.14 * 5
case 2 : return $argument[0] * $argument[1]; // 5 * 10
}
}
}
$circle = new Shape();`enter code here`
echo "Area of circle:".$circle->area()."</br>"; // display the area of circle Output 0
echo "Area of circle:".$circle->area(5)."</br>"; // display the area of circle
$rect = new Shape();
echo "Area of rectangle:".$rect->area(5,10); // display area of rectangle
オーバーライド:オブジェクト指向プログラミングでは、オーバーライドは子クラスの親メソッドを置き換えることです。オーバーライドでは、子クラスで親クラスメソッドを再宣言できます。したがって、基本的にオーバーライドの目的は、親クラスのメソッドの動作を変更することです。
オーバーライドの例:
class parent_class
{
public function text() //text() is a parent class method
{
echo "Hello!! everyone I am parent class text method"."</br>";
}
public function test()
{
echo "Hello!! I am second method of parent class"."</br>";
}
}
class child extends parent_class
{
public function text() // Text() parent class method which is override by child
class
{
echo "Hello!! Everyone i am child class";
}
}
$obj= new parent_class();
$obj->text(); // display the parent class method echo
$obj= new parent_class();
$obj->test();
$obj= new child();
$obj->text(); // display the child class method echo
PHP 5.xxはオーバーロードをサポートしていないため、PHPは完全にOOPではありません。