2015-04-07 20 views
5

Tôi có một hàm PHP với một mảng bên trong. Tôi đặt mảng bên trong để các tham số sẽ là tùy chọn và đây sẽ là các giá trị mặc định. Ví dụMảng chức năng PHP Giá trị mặc định?

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

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

Tuy nhiên tôi tiếp tục nhận được lỗi

cú pháp lỗi, bất ngờ '(', mong ']'

Vì vậy, tôi cho rằng bạn không thể vượt qua một mảng như thế này khi xây dựng một chức năng, cách tốt nhất để thực hiện điều này hoặc sửa chữa là gì?

+0

Vấn đề của bạn là gọi hàm! Bạn không thể đặt đối số mặc định với dữ liệu "động" – Rizier123

+0

Có^Nhưng suy nghĩ tốt – kevingilbert100

+0

Tôi sẽ sử dụng tiêm phụ thuộc. Truyền vào một đối tượng kiểu 'apiKeyConfig' hoặc một cái gì đó tương tự, trong đó một' apiKeyConfig' yêu cầu các tham số mà bạn đề cập, và sau đó nhập vào đối số đó phải là một cá thể của 'apiKeyConfig'. –

Trả lời

5

Bạn chỉ có thể sử dụng các loại vô hướng cho các giá trị mặc định của tham số chức năng.

Bạn cũng có thể đọc trong cuốn hướng dẫn: http://php.net/manual/en/functions.arguments.php#functions.arguments.default

Và báo giá từ đó:

Giá trị mặc định phải là một biểu thức hằng, không (ví dụ) một biến, một thành viên lớp hoặc một cuộc gọi chức năng.

EDIT:

Nhưng nếu bạn vẫn cần giá trị này là giá trị mặc định trong mảng bạn có thể làm một cái gì đó như thế này:

Chỉ cần sử dụng một trình giữ chỗ mà bạn có thể thay thế với str_replace() nếu mảng mặc định được sử dụng. Điều này cũng có lợi thế nếu bạn cần giá trị trả về của hàm trong mảng mặc định nhiều lần bạn chỉ cần sử dụng cùng một trình giữ chỗ và cả hai đều sẽ được thay thế.

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 
    //... 
} 

Một ý tưởng bạn có thể làm là thiết lập một mảng mặc định mà bạn có thể kiểm tra và sau đó gán mảng thực như thế này:

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

Bạn có đề xuất điều này qua giải pháp khác trong câu hỏi này không? – kevingilbert100

+1

@ kmgilbert100 Tốt trong cả hai câu trả lời bạn phải đảm bảo rằng trình giữ chỗ là duy nhất. Lợi thế tôi thấy ở đây là bạn có thể sử dụng trình giữ chỗ nhiều lần và bạn không cần câu lệnh if cho mọi trình giữ chỗ.(Chỉ cần thêm một ví dụ khác mà tôi nghĩ có thể là giải pháp tốt nhất, vì nếu bạn vượt qua một mảng trống bạn không phải kiểm tra) – Rizier123

+1

có vẻ như là một giải pháp tốt hơn, tôi thích nó! – kevingilbert100

1

Vấn đề ở đây là:

Auth::id() 

Điều này đòi hỏi một phương pháp đó là bất hợp pháp để làm trong bối cảnh này

tôi sẽ giải quyết nó như thế này:

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

Ic, tôi cần chức năng này để được trong các giá trị mặc định, nó sẽ là tốt nhất để chỉ làm một mảng hợp nhất trong hàm và thiết lập $ data để null theo mặc định? – kevingilbert100

+0

Cảm ơn giải pháp tuyệt vời! – kevingilbert100

Các vấn đề liên quan