web-dev-qa-db-ja.com

PHPの関数のオーバーロードとオーバーライドとは何ですか?

PHPでは、関数のオーバーロードと関数のオーバーライドとはどういう意味ですか。そして、それらの両方の違いは何ですか?それらの違いはわかりませんでした。

125
Parag

オーバーロードは、同様のシグネチャを持ち、異なるパラメーターを持つ関数を定義しています。 オーバーライドは、親クラスがメソッドを定義し、派生クラスがオーバーライドを望んでいる派生クラスにのみ関係しますそのメソッド。

PHPでは、マジックメソッド __call を使用してのみメソッドをオーバーロードできます。

overrideingの例:

<?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"
?>
187
Jacob Relkin

パラメータの異なるセットを使用して同じ関数名を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で説明されている動作をオーバーライドします。

103
Andrew Moore

厳密に言えば、どちらもできないため、違いはありません:)

関数のオーバーライドは、APDのようなPHP拡張を使用して行うこともできますが、非推奨であり、前回のバージョンでは使用できませんでした。

PHPでの関数のオーバーロードは、動的型付けのために実行できません。つまり、PHPでは、変数を特定の型に「定義」しません。例:

$a=1;
$a='1';
$a=true;
$a=doSomething();

各変数の型は異なりますが、実行前に型を知ることができます(4番目を参照)。比較として、他の言語では以下を使用します。

int a=1;
String s="1";
bool a=true;
something a=doSomething();

最後の例では、変数の型を強制的に設定する必要があります(例として、データ型「何か」を使用しました)。


PHPで関数のオーバーロードができない別の「問題」: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'
22
Christian

オーバーロードの例

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);
9
user4931222

オーバーロードのパラダイムはPHPによって完全にはサポートされていませんが、同じ(または非常に類似した)効果をデフォルトのパラメーターで実現できます(前述のとおり)。

このように関数を定義する場合:

function f($p=0)
{
  if($p)
  {
    //implement functionality #1 here
  }
  else
  {
    //implement functionality #2 here
  }
}

この関数を次のように呼び出すと:

f();

1つの機能(#1)を取得しますが、次のようなパラメーターで呼び出す場合:

f(1);

別の機能が得られます(#2)。それがオーバーロードの影響です-関数の入力パラメーターに応じて異なる機能。

私は知っています、誰かがこの関数をf(0)として呼び出すと、どのような機能が得られるかを尋ねます。

5
sbrbot

PHPでのオーバーロードは、他のプログラミング言語とはまったく異なる意味を持つことをここで指摘したいと思います。多くの人は、オーバーロードはPHPでサポートされておらず、オーバーロードの従来の定義によって、機能が明示的に利用可能ではないことを言っています。

ただし、PHPのオーバーロードの正しい定義は完全に異なります。

PHPでは、オーバーロードとは、__ set()や__get()などのマジックメソッドを使用してプロパティとメソッドを動的に作成することを指します。これらのオーバーロードメソッドは、アクセスできないか宣言されていないメソッドまたはプロパティと対話するときに呼び出されます。

PHPマニュアルからのリンクは次のとおりです。 http://www.php.net/manual/en/language.oop5.overloading.php

1
Ram Iyer

メソッドのオーバーロードは、メソッド名が同じで、単一クラスのパラメーターの数が異なる2つ以上のメソッドがある場合に発生します。 PHPはメソッドのオーバーロードをサポートしていません。メソッドのオーバーライドとは、2つの異なるクラスで同じメソッド名と同じ数のパラメーターを持つ2つのメソッドが親クラスと子クラスを意味することを意味します。

0

オーバーロード:現実の世界では、オーバーロードとは、余分なものを誰かに割り当てることを意味します。現実世界と同様に、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
0
user3040433

関数のオーバーロードとオーバーライドにはいくつかの違いがありますが、両方に同じ関数名が含まれています。オーバーロードでは、同じ名前の関数には異なるタイプの引数または戻り値のタイプが含まれます。 function add(float a、float b);ここでadd()関数はオーバーロードされます引数と関数名の両方をオーバーライドする場合は同じです。一般に継承または特性にあります。 、どの関数が今実行されるので、プログラマーはいくつかの戦術に従って目的の関数を実行します。

0
Mashuq Tanmoy