Named Arguments in PHP

前端 未结 3 1276
自闭症患者
自闭症患者 2020-12-12 05:09

In C#, there is a new feature coming with 4.0 called Named Arguments and get along well with Optional Parameters.

private static void writeSomething(int a =          


        
相关标签:
3条回答
  • 2020-12-12 05:27

    You can get around that by having an array such as $array= array('arg1'=>'value1'); And then let the function accept the array such as function dostuff($stuff); Then, you can check arguments using if(isset($stuff['arg1')){//do something.} inside the function itself

    It's just a work-around but maybe it could help

    0 讨论(0)
  • 2020-12-12 05:29

    As you found out, named arguments don't exist in PHP.


    But one possible solution would be to use one array as unique parameter -- as array items can be named :

    my_function(array(
        'my_param' => 10, 
        'other_param' => 'hello, world!', 
    ));
    


    And, in your function, you'd read data from that unique array parameter :

    function my_function(array $params) {
    
        // test if $params['my_param'] is set ; and use it if it is
        // test if $params['other_param'] is set ; and use it if it is
        // test if $params['yet_another_param'] is set ; and use it if it is
        // ...
    
    }
    


    Still, there is one major inconvenient with this idea : looking at your function's definition, people will have no idea what parameters it expects / they can pass.

    They will have to go read the documentation each time they want to call your function -- which is not something one loves to do, is it ?

    Additionnal note : IDEs won't be able to provide hints either ; and phpdoc will be broken too...

    0 讨论(0)
  • 2020-12-12 05:36

    You can fake C++-style optional arguments (i.e. all optional arguments are at the end) by checking for set variables:

    function foo($a, $b)
    {
      $x = isset($a) ? $a : 3;
      $y = isset($b) ? $b : 4;
      print("X = $x, Y = $y\n");
    }
    
    @foo(8);
    @foo();
    

    It'll trigger a warning, which I'm suppressing with @. Not the most elegant solution, but syntactically close to what you wanted.


    Edit. That was a silly idea. Use variadic arguments instead:

    // faking foo($x = 3, $y = 3)
    function foo()
    {
      $args = func_get_args();
      $x = isset($args[0]) ? $args[0] : 3;
      $y = isset($args[1]) ? $args[1] : 3;
      print("X = $x, Y = $y\n");
    }
    
    foo(12,14);
    foo(8);
    foo();
    
    0 讨论(0)
提交回复
热议问题