5

Ich weiß es möglich ist, optionale Argumente wie folgt zu verwenden:PHP Optional Parameter - Parameterwert nach Name angeben?

function doSomething($do, $something = "something") { 

} 

doSomething("do"); 
doSomething("do", "nothing"); 

Aber nehmen Sie die folgende Situation:

function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") { 

} 

doSomething("do", $or=>"and", $nothing=>"something"); 

So in der obigen Zeile würde es $something „etwas“ default, obwohl ich Werte für alles andere setze. Ich weiß, dass dies in .net möglich ist - ich benutze es die ganze Zeit. Aber ich muss dies in PHP tun, wenn möglich.

Kann mir jemand sagen, ob das möglich ist? Ich ändere das Omnistar Affiliate-Programm, das ich in Interspire Shopping Cart integriert habe - also möchte ich eine funktionierende Funktion für alle Orte beibehalten, an denen ich den Aufruf der Funktion nicht ändere, sondern an einem Ort (den ich erweitere) möchte zusätzliche Parameter angeben. Ich möchte keine andere Funktion erstellen, es sei denn, ich muss es unbedingt tun.

+1

+1 zu @sanmai; Beachten Sie auch, dass Perl, Python und Ruby alle benannten Parameter in der von Ihnen beschriebenen Weise unterstützen. Wenn diese Funktion wichtig genug ist, sollten Sie eine dieser Sprachen in Betracht ziehen. –

Antwort

11

Nein, in PHP, die nicht möglich, da der Schrift ist. Verwendung Array Argumente:

function doSomething($arguments = array()) { 
    // set defaults 
    $arguments = array_merge(array(
     "argument" => "default value", 
    ), $arguments); 

    var_dump($arguments); 
} 

Verwendungsbeispiel:

doSomething(); // with all defaults, or: 
doSomething(array("argument" => "other value")); 

Wenn ein bestehendes Verfahren zu ändern:

//function doSomething($bar, $baz) { 
function doSomething($bar, $baz, $arguments = array()) { 
    // $bar and $baz remain in place, old code works 
} 
+0

Das scheint die Art von Sache zu sein, die ich verwenden sollte. Wird es als die richtige Antwort ankreuzen, wenn ich dazu in der Lage bin. Vielen Dank. – ClarkeyBoy

+0

Nur an eine Sache gedacht - derzeit gibt es 4 Argumente, von denen zwei optional sind. Ich möchte noch eine weitere hinzufügen 4. Durch die Implementierung dieser Methode würde ich es auf ein Argument (ein Array) reduzieren. Dies würde alle Aufrufe der Funktion außerhalb der Datei, in der ich dies ändern möchte, unterbrechen.Es ist schon eine Ewigkeit her, seit ich PHP zum letzten Mal benutzt habe, aber ich gehe davon aus, dass ich einfach eine andere Funktion erstellen kann, die dasselbe heißt, aber mit einer anderen Anzahl von Argumenten. Nicht ideal - aber das sollte funktionieren. – ClarkeyBoy

+0

@ClarkeyBoy Sie können so viele Argumente haben, wie Sie möchten. Siehe zusätzliches Beispiel. – sanmai

3

Werfen Sie einen Blick auf func_get_args: http://au2.php.net/manual/en/function.func-get-args.php

+0

Danke für die Eingabe - aber ich denke, dass Sanmais Antwort meiner Situation ein bisschen besser passt. Mit dieser Methode wäre ich nicht in der Lage, ein Argument mit Namen zu finden - also würde ich die gleiche Mauer treffen (glaube ich). – ClarkeyBoy

2

Benannte Argumente sind derzeit nicht in PHP (5.3) zur Verfügung.

Um dies zu umgehen, sehen Sie häufig eine Funktion ein Argument array() empfängt und dann extract() die angegebenen Argumente in lokalen Variablen oder array_merge() verwenden, indem sie auf dem Standard.

Ihr ursprüngliches Beispiel würde in etwa so aussehen:

$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something'); 
doSomething($args); 
0

PHP keine benannte Parameter hat. Sie müssen sich für eine Problemumgehung entscheiden.

Am häufigsten wird ein Array-Parameter verwendet. Aber eine andere clevere Methode ist die Verwendung von URL-Parametern, wenn Sie Literalwerte benötigen:

function with_options($any) { 
     parse_str($any); // or extract() for array params 
} 

with_options("param=123&and=and&or=or"); 

Kombinieren Sie diesen Ansatz mit Standardparametern wie es passt Ihren speziellen Anwendungsfall.

+0

Was für ein Overkill! Überlegen Sie, ein Objekt auf diese Weise zu übergeben. – sanmai

+2

@sanmai: Kommt immer auf die Verwendung an. Microoptimizations sind für Dummköpfe. Und imaginärer Overhead ist vorzuziehen, um sich mit einer ungeschickten API zu behindern. – mario