2009-02-23 31 views
7

Tôi có điều này:Có thể bỏ qua các tham số có giá trị mặc định trong cuộc gọi hàm php (5) không?

function foo($a='apple', $b='brown', $c='Capulet') { 
    // do something 
} 

là một cái gì đó như thể này:

foo('aardvark', <use the default, please>, 'Montague'); 
+1

Có đề xuất triển khai tính năng này trong php5.5 [https://wiki.php.net/rfc/skipparams](https://wiki.php.net/rfc/skipparams) – Shahid

+0

Còn Syntactic thì sao? https://github.com/topclaudy/php-syntactic – cjdaniel

Trả lời

1

Bạn thấy khá nhiều câu trả lời, nhưng cách tiếp cận học thuật/cấp cao là function currying mà tôi thành thật không bao giờ tìm thấy nhiều việc sử dụng, nhưng hữu ích để biết tồn tại.

+0

Tôi không nghĩ rằng currying có thể làm bất cứ điều gì về giá trị đối số mặc định - chúng có khá nhiều khái niệm loại trừ lẫn nhau. – jpalecek

5

Nếu đó là chức năng riêng của bạn thay vì một trong những cốt lõi của PHP, bạn có thể làm:

function foo($arguments = []) { 
    $defaults = [ 
    'an_argument' => 'a value', 
    'another_argument' => 'another value', 
    'third_argument' => 'yet another value!', 
    ]; 

    $arguments = array_merge($defaults, $arguments); 

    // now, do stuff! 
} 

foo(['another_argument' => 'not the default value!']); 
12

Nếu đó là chức năng của bạn, bạn có thể sử dụng null như ký tự đại diện và thiết lập giá trị mặc định sau bên trong hàm:

function foo($a=null, $b=null, $c=null) { 
    if (is_null($a)) { 
     $a = 'apple'; 
    } 
    if (is_null($b)) { 
     $b = 'brown'; 
    } 
    if (is_null($c)) { 
     $c = 'Capulet'; 
    } 
    echo "$a, $b, $c"; 
} 

Sau đó, bạn có thể bỏ qua chúng bằng cách sử dụng null:

foo('aardvark', null, 'Montague'); 
// output: "aarkvark, brown, Montague" 
0

Bạn có thể sử dụng một số quirks, hoặc là vượt qua tất cả các đối số như một mảng như ceejayoz gợi ý, hoặc một số mã quá phức tạp phân tách func_get_args() và kết hợp với danh sách mặc định. Không phải sao chép-dán nó, bạn sẽ phải sử dụng các đối tượng và đặc điểm. Cuối cùng, để có thể truyền tất cả các loại giá trị (không bao gồm null hoặc false bằng cách đặt chúng thành tín hiệu cho thay thế param mặc định), bạn sẽ phải khai báo một kiểu đặc biệt dummy DefaultParam. Một dấu trừ khác là bạn phải nhân đôi tên và giá trị mặc định trong khai báo hàm, nếu bạn muốn nhận gợi ý kiểu hoặc trợ giúp trong bất kỳ IDE nào.

class DefaultParam {} 

trait multi_arg_functions 
{ 
    private static function multi_arg($defaults, $list, $preserve_index = false) 
    { 
    $arg_keys = array_slice(array_keys($defaults), 0, count($list)); 

    if ($preserve_index) { 
     $listed_arguments = array_slice($list, 0, count($arg_keys)); 
     $extras = array_slice($list, count($arg_keys), null, true); 
    } else { 
     $listed_arguments = array_splice($list, 0, count($arg_keys)); 
     $extras = &$list; 
    } 
    unset($list); 

    $arguments = array_combine($arg_keys, $listed_arguments); 
    $arguments = array_filter($arguments, function ($entry) { 
     return !($entry instanceof DefaultParam); //remove entries that mean default, a special class in this case 
    }); 
    $arguments = array_merge($defaults, $arguments); 

    return [$arguments, $extras]; 
    } 
} 

class b { 
    use multi_arg_functions; 

    static function func1($an_argument = 'a value', $another_argument = 'another value', $third_argument = 'yet another value') { //give defaults here to get hints in an IDE 
     list($args, $extras) = self::multi_arg(//note: duplicate names and defaults 
      [ 
      'an_argument' => 'a value', 
      'another_argument' => 'another value', 
      'third_argument' => 'yet another value!', 
      ], func_get_args()); 

     echo json_encode(['args' => $args, 'extras' => $extras])."\n"; 
    } 
} 

$default_param = new DefaultParam(); 

b::func1('value 1'); 
b::func1('value 2', $default_param, 'third argument'); 
b::func1('value 3', $default_param, 'third argument', 'fourth argument'); 

Lưu ý: bằng cách sử dụng preserve_index = true, bạn có thêm đối số để bắt đầu từ chỉ mục gốc của chúng.

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