• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Kann man in PHP5 Methoden überladen?

Status
Für weitere Antworten geschlossen.

CrackPod

Neues Mitglied
Hallo,

da ich das für eine Klasse Methodenüberladung - wie in Java o.ä. - bräuchte, habe ich mich gefragt, ob sich das realisieren lässt, oder muss ich da ein Workaround machen?
Ich habe im Man nachgeschaut, aber die magischen Methoden zu überladen bringt mir recht wenig :wink:. Ich müsste eigene Methode überladen können
Beispiel:
PHP:
class ABC
{
  public function getError()
  {
    echo 'Standardfehler';
  }
  public function getError($strError)
  {
    echo $strError;
  }
}
Verständlich beschrieben?
So wie oben gehts ja leider nicht, aber ich habe die Hoffnung, dass es irgendwie anders geht :wink: (also ohne isset && !empty von $strError und dann im If-Kontrollkörper die andere Methode)
 
Ganz ehrlich: Versteh ich (noch) nich
So wie ich das jetz aufgeriffen hab, kann ich damit nur allgemein eine Überladene Methode definieren, die dann für alle gilt?!
 
Man kann in PHP keine Funktion zweimal definieren egal ob sie unterschiedliche Parameter hat oder nicht. Du musst mit workarounds arbeiten oder default-Werte setzten.

Beispiel:
PHP:
function test($param1 = 0, $param2 = 2)
{
// Quelltext
}

// Kann so:
test();

//So:
test(600);

// Oder so:
test(400, 255);

// aufgerufen werden.

Wenn du alledings Objekt Orientiert arbeitest kannst du die Methoden der Geerbten-Klasse überschreiben. Jedoch ist auch da keine änderung der anzahl der Parameter möglich.

EDIT: Auf dein Beispiel bezogen:
PHP:
class ABC
{
  public function getError($strError = null)
  {
    if(is_null($strError))
      echo 'Standardfehler';
    else
      echo $strError;
  }
}
 
C++ und Java generieren ja beim Compilieren aus dem Funktionsnamen und den Typen der Parameter künstliche Symbolnamen. Wer schon mal kryptische C++ Linkerfehler gesehen hat, dürfte mit den Interna ja Bekanntschaft geschlossen haben. Da PHP ja nicht wirklich typisiert ist, kann das da auch nicht funktionieren. Ob PHP6 mal sowas enthalten wird bezweifle ich stark, trotz ersten Schritten wie TypeHinting.

Also "Workaround" habe ich schon häufig Schlachten mit func_num_args, func_get_arg und co oder Typprüfungen und größere if-Konstrukte gesehen, was ich aber aus Performancegründen nicht für sinnvoll halte. Stattdessen finde ich Funktionsnamen, die den Typ der Parameter enthalten, besser.

Also z.B.
PHP:
class Foo {
  getBarById($id) {..}
  getBarByName($name) {..}
}

Sollte man mit (sinnvollen) default-Parametern auskommen, ist das natürlich am Besten. Für Dein Beispiel dann einfach
PHP:
class ABC {
  public function getError($strError = 'Standardfehler') {
      echo $strError;
  }
}
 
Ist soweit ich das sehe im letztzen Post nicht ganz rübergekommen:
Die funktion func_get_args erledigt das ( http://de3.php.net/func_get_args ) ?

Falls du 2 verschiedene Funktionen mit dem selben namen meinst: nein das kannst du 100% vergessen. ich sehe darin auch genau gar keinen sinn.
 
niklasboelter schrieb:
Falls du 2 verschiedene Funktionen mit dem selben namen meinst: nein das kannst du 100% vergessen. ich sehe darin auch genau gar keinen sinn.
Zwei Methoden mit gleichen Namen und unterschiedlicher Parameteranzahl bzw. unterschiedlichen Parametertypen --> Überladen von Methoden.

Den Sinn muss ich dir nicht erklären. Den kennst du selbst! Demnach verstehe ich deine Aussage nicht.
 
Es sind eben keine 2 Methoden mit unterschiedlichen Parametern sondern eine Methode mit beliebig vielen Parametern. Logisch gesehen ist da natürlich kein grosser Unterschied - nur kann man bei PHP halt keine 2 gleichnamigen EInträge in der Symboltabelle eines Namespace haben - anzahl der Parameter hin oder her :)

Ich würde sagen es ist was anderes, für den >user< ist es aber ziehmlich egal weils gleich funktioniert ;)
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben