2015-04-07 15 views
5

Ich habe eine PHP-Funktion mit einem Array innerhalb. Ich setze das Array hinein, so dass die Parameter Option wären und dies wären die Standardwerte. BeispielPHP-Funktions-Array-Standardwerte?

/** 
* Creates New API Key 
* 
* @return Response 
*/ 

public function create(
    $data = [ 
     "user-id" => Auth::id(), 
     "level" => '1', 
     "ignore-limits" => '0', 
    ]){ 
    ... 
} 

Jedoch habe ich den Fehler erhalte

Syntaxfehler, unerwartete '(', erwartet ']'

Also gehe ich davon aus, dass Sie ein Array wie folgt passieren kann nicht, wenn Erstellen einer Funktion Was wäre ein besserer Weg, dies zu tun oder eine Lösung?

+0

Ihr Problem sind der Funktionsaufruf! Sie können das Standardargument nicht mit "dynamischen" Daten setzen – Rizier123

+0

Ja^Aber gutes Denken – kevingilbert100

+0

Ich würde Abhängigkeitsinjektion verwenden. Übergeben Sie ein Objekt vom Typ 'apiKeyConfig' oder etwas Ähnliches, wobei 'apiKeyConfig' die von Ihnen erwähnten Parameter benötigt, und geben Sie dannhinzu, dass das Argument eine Instanz von' apiKeyConfig' sein muss. –

Antwort

5

Sie können nur skalare Typen für die Standardwerte von Funktionsargumenten verwenden.

Sie können dies auch im Handbuch lesen: http://php.net/manual/en/functions.arguments.php#functions.arguments.default

und ein Zitat von dort:

Der Standardwert muss ein konstanter Ausdruck seine, nicht (zum Beispiel) eine Variable, ein Klassenmitglied oder ein Funktionsaufruf.

EDIT:

Aber wenn Sie immer noch diesen Wert als Standardwert in dem Feld benötigen könnten Sie so etwas tun:

nur einen Platzhalter verwenden, die Sie mit str_replace() ersetzen können, wenn die Standard-Array wird verwendet. Dies hat auch den Vorteil, dass Sie den Rückgabewert der Funktion im Standardarray mehrmals benötigen, wenn Sie nur denselben Platzhalter verwenden müssen und beide ersetzt werden.

public function create(
    $data = [ 
     "user-id" => "::PLACEHOLDER1::", 
        //^^^^^^^^^^^^^^^^ See here just use a placeholder 
     "level" => '1', 
     "ignore-limits" => '0', 
    ]){ 
    $data = str_replace("::PLACEHOLDER1::", Auth::id(), $data); 
      //^^^^^^^^^^^ If you didn't passed an argument and the default array with the placeholder is used it get's replaced 
    //$data = str_replace("::PLACEHOLDER2::", Auth::id(), $data); <- AS many placeholder as you need; Just make sure they are unique 
    //... 
} 

Eine weitere Idee Sie ein Standard-Array tun könnten, ist eingestellt, die Sie überprüfen und dann die realen Array wie folgt vergeben:

public function create($data = []){ 
    if(count($data) == 0) { 
     $data = [ 
      "user-id" => Auth::id(), 
      "level" => '1', 
      "ignore-limits" => '0', 
     ];  
    } 
    //... 
} 
+0

Würden Sie dies gegenüber der anderen Lösung in dieser Frage empfehlen? – kevingilbert100

+1

@ kmgilbert100 In beiden Antworten müssen Sie sicherstellen, dass die Platzhalter eindeutig sind. Der Vorteil, den ich hier sehe, ist, dass Sie den Platzhalter mehrfach verwenden können und Sie keine if-Anweisung für jeden Platzhalter benötigen.(Ich habe gerade ein anderes Beispiel hinzugefügt, was meiner Meinung nach die beste Lösung ist, denn wenn Sie ein leeres Array übergeben, müssen Sie nicht nachsehen) – Rizier123

+1

scheint sogar eine bessere Lösung zu sein, ich mag es, danke! – kevingilbert100

1

Das Problem ist hier:

Dies erfordert eine Methode, die in diesem Zusammenhang

Ich würde es lösen, wie dies zu tun ist illegal:

public function create(
    $data = [ 
     "user-id" => -1, 
     "level" => '1', 
     "ignore-limits" => '0', 
    ]){ 
    if($data['user-id'] === -1) { 
     $data['user-id'] = Auth::id() 
    } 
    ... 
} 
+0

Ic, ich brauche diese Funktion, um innerhalb der Standardwerte zu sein, wäre es am besten, nur eine Array-Zusammenführung innerhalb der Funktion durchzuführen und $ data standardmäßig auf null zu setzen? – kevingilbert100

+0

Dank brillante Lösung! – kevingilbert100