Was ist Funktionsüberladung und -überschreibung in PHP?

Antworten:

192

Überladen definiert Funktionen mit ähnlichen Signaturen, jedoch unterschiedlichen Parametern. Das Überschreiben ist nur für abgeleitete Klassen relevant, bei denen die übergeordnete Klasse eine Methode definiert hat und die abgeleitete Klasse diese Methode überschreiben möchte .

In PHP können Sie Methoden nur mit der magischen Methode überladen __call.

Ein Beispiel für das Überschreiben :

<?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"
?>
Jacob Relkin
quelle
31
PHP unterstützt jedoch keine Überladung.
Sasha Chedygov
18
Ja, mit __call.
Jacob Relkin
50
PHP ersetzt das Überladen über optionale Parameter.
B01
3
Vielen Dank für die Idee der optionalen Parameter. Es ist ein wirklich hilfreicher Hinweis
Fabricio PH
2
__call () wird ausgelöst, wenn unzugängliche Methoden im Objektkontext aufgerufen werden. __callStatic () Die Megic-Methode wird ausgelöst, wenn unzugängliche Methoden im statischen Kontext aufgerufen werden. Befolgen Sie diese
Code Buster
107

Funktionsüberladung tritt auf, wenn Sie denselben Funktionsnamen zweimal (oder mehrmals) mit unterschiedlichen Parametersätzen definieren. Beispielsweise:

class Addition {
  function compute($first, $second) {
    return $first+$second;
  }

  function compute($first, $second, $third) {
    return $first+$second+$third;
  }
}

Im obigen Beispiel ist die Funktion computemit zwei verschiedenen Parametersignaturen überladen. * Dies wird in PHP noch nicht unterstützt. Eine Alternative besteht darin, optionale Argumente zu verwenden:

class Addition {
  function compute($first, $second, $third = 0) {
    return $first+$second+$third;
  }
}

Das Überschreiben von Funktionen tritt auf, wenn Sie eine Klasse erweitern und eine in der übergeordneten Klasse vorhandene Funktion neu schreiben:

class Substraction extends Addition {
  function compute($first, $second, $third = 0) {
    return $first-$second-$third;
  }
}

Zum Beispiel computeüberschreibt die eingestellte Verhalten nach Addition.

Andrew Moore
quelle
9
Außer Funktionsüberladung wird in PHP, AFAIK nicht unterstützt. Außerdem bin ich mir nicht sicher, warum eine SubtractionKlasse die AdditionKlasse erweitern soll. :)
Sasha Chedygov
6
@musicfreak: 00:40 Ortszeit ... Ich könnte mir kein besseres Beispiel vorstellen.
Andrew Moore
5
Dies wird in PHP noch nicht unterstützt und wird es wahrscheinlich auch nie tun, da PHP eine schwach typisierte Sprache ist und sich in diesem Fall nichts ändern wird.
Crozin
2
Überladen ist nicht nur dann der Fall, wenn Sie denselben Funktionsnamen zweimal (oder mehrmals) mit unterschiedlichen Parametern definieren. Im Allgemeinen liegt eine Überladung auch vor, wenn Sie denselben Funktionsnamen zweimal (oder mehrmals) mit derselben Anzahl von Parametern, jedoch unterschiedlichen Typs definieren. Da es in PHP keine Variablentypdeklaration gibt (wie in Java), spielt diese Verallgemeinerung keine Rolle. Ich erwähne dies nur aus Gründen der Genauigkeit, was Überlastung ist.
sbrbot
2
@sbrbot: Set impliziert sowohl Anzahl als auch Typ.
Andrew Moore
22

Genau genommen gibt es keinen Unterschied, da Sie das auch nicht können :)

Das Überschreiben von Funktionen hätte mit einer PHP-Erweiterung wie APD erfolgen können, ist jedoch veraltet und die letzte Version von afaik war unbrauchbar.

Funktionsüberladung in PHP kann aufgrund dynamischer Typisierung nicht durchgeführt werden, dh in PHP "definieren" Sie Variablen nicht als einen bestimmten Typ. Beispiel:

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

Jede Variable hat einen anderen Typ, Sie können den Typ jedoch vor der Ausführung kennen (siehe den vierten). Zum Vergleich verwenden andere Sprachen:

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

Im letzten Beispiel müssen Sie den Variablentyp zwangsweise festlegen (als Beispiel habe ich den Datentyp "etwas" verwendet).


Ein weiteres "Problem", warum eine Funktionsüberladung in PHP nicht möglich ist: PHP hat eine Funktion namens func_get_args (), die ein Array aktueller Argumente zurückgibt. Betrachten Sie nun den folgenden Code:

function hello($a){
  print_r(func_get_args());
}

function hello($a,$a){
  print_r(func_get_args());
}

hello('a');
hello('a','b');

Wenn man bedenkt, dass beide Funktionen eine beliebige Anzahl von Argumenten akzeptieren, welches sollte der Compiler wählen?


Abschließend möchte ich darauf hinweisen, warum die obigen Antworten teilweise falsch sind; Das Überladen / Überschreiben von Funktionen entspricht NICHT dem Überladen / Überschreiben von Methoden .

Wenn eine Methode wie eine Funktion ist, aber für eine Klasse spezifisch ist, erlaubt PHP in diesem Fall das Überschreiben in Klassen, aber wiederum keine Überladung aufgrund der Sprachsemantik.

Zusammenfassend lässt sich sagen, dass Sprachen wie Javascript das Überschreiben (aber auch kein Überladen) zulassen. Sie können jedoch auch den Unterschied zwischen dem Überschreiben einer Benutzerfunktion und einer Methode aufzeigen:

/// 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'
Christian
quelle
2
PHP 5.xx unterstützt keine Überladung. Aus diesem Grund ist PHP nicht vollständig OOP.
PHP Ferrari
30
Es ist nicht so, dass PHP keine Überladung unterstützt, es ist so, dass es keinen Sinn ergibt. Das Problem ist auf PHP zurückzuführen, das dynamische Typen verwendet. Tatsächlich unterstützt Javascript auch keine Überladung und ist immer noch OOP. Der Fud "PHP ist nicht vollständig OOP" existiert nur, weil einige Leute beschlossen haben, eine Checkliste zu verwenden, um zu beurteilen, was OOP ist oder nicht.
Christian
@ ringø Nein, benannte Funktionen in PHP sind unveränderlich. Sobald Sie eine benannte Funktion in PHP erstellt haben, können Sie ihr internes Verhalten nicht mehr ändern (überschreiben). Es sei denn, Sie meinten das Überschreiben von Methoden, was etwas anderes ist. Sie sollten wahrscheinlich die gesamte Antwort lesen, bevor Sie die erste Zeile kommentieren. :)
Christian
@Christian Nun, natürlich tritt in PHP (und vielen anderen Sprachen) das Überschreiben in einer Klasse auf . Also, ja, wir reden über Methoden - obwohl jeder von ihnen mit dem Schlüsselwort vorangestellt ist Funktion . Aber in der Tat hätte ich die ganze Antwort zuerst lesen sollen ...
e2-e4
9

Überladungsbeispiel

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);
Gehen
quelle
Schöne benutzerdefinierte Implementierung, aber es sollte von der Sprache gegeben sein.
4JEDER
Dies ist keine Methode, Funktionsüberladung, während Sie für jeden Schüler einen anderen Methodennamen verwenden
TomSawyer
5

Obwohl das Überladungsparadigma von PHP nicht vollständig unterstützt wird, kann der gleiche (oder sehr ähnliche) Effekt mit Standardparametern erzielt werden (wie bereits erwähnt).

Wenn Sie Ihre Funktion folgendermaßen definieren:

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

Wenn Sie diese Funktion wie folgt aufrufen:

f();

Sie erhalten eine Funktionalität (Nr. 1), aber wenn Sie sie mit folgenden Parametern aufrufen:

f(1);

Sie erhalten eine weitere Funktionalität (# 2). Das ist der Effekt der Überladung - unterschiedliche Funktionen abhängig von den Eingabeparametern der Funktion.

Ich weiß, jemand wird jetzt fragen, welche Funktionalität man bekommt, wenn er diese Funktion als f (0) aufruft.

sbrbot
quelle
1

Ich möchte hier darauf hinweisen, dass das Überladen in PHP im Vergleich zu anderen Programmiersprachen eine völlig andere Bedeutung hat. Viele Leute haben gesagt, dass Überladung in PHP nicht unterstützt wird und nach der herkömmlichen Definition von Überladung ja, dass Funktionalität nicht explizit verfügbar ist.

Die korrekte Definition der Überladung in PHP ist jedoch völlig anders.

In PHP bezieht sich Überladung auf das dynamische Erstellen von Eigenschaften und Methoden mit magischen Methoden wie __set () und __get (). Diese Überladungsmethoden werden aufgerufen, wenn mit Methoden oder Eigenschaften interagiert wird, auf die nicht zugegriffen werden kann oder die nicht deklariert sind.

Hier ist ein Link aus dem PHP-Handbuch: http://www.php.net/manual/en/language.oop5.overloading.php

Ram Iyer
quelle
1

Methodenüberladung tritt auf, wenn zwei oder mehr Methoden mit demselben Methodennamen, aber unterschiedlicher Anzahl von Parametern in einer Klasse. PHP unterstützt keine Methodenüberladung. Das Überschreiben von Methoden bedeutet, dass zwei Methoden mit demselben Methodennamen und derselben Anzahl von Parametern in zwei verschiedenen Klassen übergeordnete Klasse und untergeordnete Klasse bedeuten.

Shriyash Deshmukh
quelle
0

Es gibt einige Unterschiede zwischen Funktionsüberladung und -überschreibung, obwohl beide denselben Funktionsnamen enthalten. Beim Überladen enthalten Funktionen mit demselben Namen unterschiedliche Argument- oder Rückgabetypen. Beispiel: "function add (int a, int b)" & " Funktion add (float a, float b); Hier ist die Funktion add () überladen. Beim Überschreiben sind sowohl das Argument als auch der Funktionsname gleich. Sie findet sich im Allgemeinen in der Vererbung oder in Merkmalen. Wir müssen einige Taktiken befolgen, um sie einzuführen , welche Funktion wird jetzt ausgeführt? Beim Überschreiben folgt der Programmierer einigen Taktiken, um die gewünschte Funktion auszuführen, wobei das Programm beim Überladen automatisch die gewünschte Funktion identifizieren kann ... Danke!

Mashuq Tanmoy
quelle
0

Überladen: In der realen Welt bedeutet Überladen, jemandem zusätzliche Dinge zuzuweisen. Wie in der realen Welt bedeutet Überladen in PHP das Aufrufen zusätzlicher Funktionen. Auf andere Weise können Sie sagen, dass es eine schlankere Funktion mit verschiedenen Parametern hat. In PHP können Sie das Überladen mit magischen Funktionen verwenden, z. B. __get, __set, __call usw.

Beispiel für Überladung:

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

Überschreiben: Bei der objektorientierten Programmierung wird beim Überschreiben die übergeordnete Methode in der untergeordneten Klasse ersetzt. Beim Überschreiben können Sie die übergeordnete Klassenmethode in der untergeordneten Klasse erneut deklarieren. Der Zweck des Überschreibens besteht also im Wesentlichen darin, das Verhalten Ihrer übergeordneten Klassenmethode zu ändern.

Beispiel für das Überschreiben:

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
user3040433
quelle
-14

PHP 5.xx unterstützt keine Überladung. Aus diesem Grund ist PHP nicht vollständig OOP.

PHP Ferrari
quelle
18
Ich weiß nicht, woher Sie die Idee haben, eine Anforderung für die objektorientierte Programmierung zu überladen.
Zeichnen
6
@drewish, weil parametrischer Polymorphismus eines der wichtigsten Merkmale von OOP ist?
Davor
1
@drewish, wenn Sie Polymorphismus als eine der Hauptstagnationen von OOP betrachten. Dann ist angeblich eine Überladung für die Kompilierung da draußen. Das Überladen von Methoden ist jedoch der Polymorphismus zur Kompilierungszeit und wird auch als statischer Polymorphismus bezeichnet.
Yasir Arefin