4 ms·
Why not use a dictionary or parameter object when you get past 2 arguments? Or is that not a thing in PHP?
by arcosdev 6y ago
Why not use a dictionary or parameter object when you get past 2 arguments? Or is that not a thing in PHP?
- flemhans 6y agoThat's what the above comment was referring to when saying people to things like: call_user_func_array($function, ['length' => $n, 'foo' => $bar, ...]);
- stareatgoats 6y ago> and basically nobody does that anyway. That's it, I'm officially a nobody :-)
- sildur 6y ago> leaves it up to the called function to sanity-check the input types instead of letting the compiler do it, and basically nobody does that anyway. You don’t check the input types?
- stareatgoats 6y agoYou're reading the sentence incorrectly: "and basically nobody does that anyway", means the preceding type checking argument you refer to is moot. So I insist, I am a nobody (according to this definition). Btw I don't always sanity check the parameters, mostly at the system edges only.
- z92 6y agoNot in get-it-done, hackish scripts.
- webignition 6y agoI'd think that such a solution doesn't solve but merely moves the problem. A method with N arguments, where N > 2, with a call that is messy due to the number of arguments could instead take a single argument being a parameter object where the constructor for the parameter object takes the same N arguments. A constructor with N arguments with a call that is messy due to the number of arguments ...
- SAI_Peregrinus 6y agoAah, so then you use the Builder Pattern! Instead of one constructor taking N arguments, have a constructor that takes no arguments and N function calls to initialize the constructed values. It's cleaner because it's a named pattern! /s
- beberlei 6y agoThat is possible, but requires writing a class, which increases mental load
- raziel2p 6y agoWith a dictionary (array in PHP) you lose strict typing and it's possible for the person constructing it to make a typo and it won't cause an error, the called function will just think an optional argument was left out. Writing and maintaining parameter classes is just tedious.
- wonderlg 6y agoTypescript can do it, so why not add the same feature to PHP as well? As a JS/TS developer, all I see is avoiding two characters: {}, everything else is possible in JavaScript and well-typed in TypeScript. PHP 8 save( value: 3 ) JS 1 save({ value: 3 })
- duckerude 6y agoPHP's strict typing is only enforced at runtime, and because of that, its type system is very simple, unlike Typescript's. You can enforce that a variable is an array, but not that it's an array of ints, let alone that it's an array with certain types under certain keys. Although there is external tooling that uses static analysis for such more complicated types.
- xellisx 6y agoWe really need structs in PHP. I drew up a draft, but didn't get very far with it. https://github.com/ellisgl/PHP-RFC-Struct-Data-Type https://github.com/ellisgl/PHP-RFC-Struct-Data-Type
- gvjddbnvdrbv 6y agoI've tried it but it gets messy.
- Lammy 6y agoYou can get the best of both approaches in PHP 5.6 or later using the argument unpacking "..." operator that works similarly to the */"splat" operator in Python or Ruby: https://www.php.net/manual/en/migration56.new-features.php https://www.php.net/manual/en/migration56.new-features.php
- gremlinsinc 6y agoit's not the best of both worlds though, splat should only be used on something where you're basically doing the same thing to a bunch of things. like add(1,2,3,4,5) -> function add(...$nums){ $count = 0; foreach($nums as $num) { $count += $num; } } If you know what arguments you're getting, then the more sound way would be just use an associative array, but either way you really don't get great type checking. This is a much better solution.
- gremlinsinc 6y agoI do this all the time, but it feels wrong... and you don't get type checking, this feels like it makes more sense and logical.