On Wed, May 1, 2024, at 9:26 PM, Joshua Rüsweg wrote:
> Hi
>
> On 01.05.24 12:26, Larry Garfield wrote:
>> This looks good to me, with one remaining exception, which isn't specific to 
>> this function but should still be discussed: Always passing the value and 
>> key to the callback is unsafe, for two reasons.
>> 
>> 1. If the callback is an internal function rather than a user-land one, and 
>> it has only one argument, it will error confusingly.  That makes the current 
>> implementation incompatible with unary built-in functions.  See, for 
>> instance, https://www.php.net/is_string (and friends)
>
> I think, that this problem can easily be detected with static analysers. 
> Currently neither PHPStan [1] nor psalm [2] does detect this issue, but 
> as the tools already validate the signature (e.g. str_contains is 
> rejected) this can probably be integrated and might even be considered a 
> bug.
>
> The proper fix from PHP's side would be something like the proposal in 
> https://externals.io/message/122928 (RFC idea: using the void type to 
> control maximum arity of user-defined functions).

It's not just that it errors confusingly.  It's that the design as is would be 
incompatible with any C-based function.  A function that works with anything 
*except* the standard library seems... problematic.

It's possible that, since these new functions are C-based, we could do some 
extra detection to see if the function is unary or not, and pass only the value 
if it is.  I don't know if that is possible to do performantly in C, but it's 
definitely more of an option than if they were in user-space.  (Again, I don't 
know if this is the best solution, but it seems like a possible solution.)

--Larry Garfield

Reply via email to