On Sun, Apr 19, 2026, at 10:06 AM, Tim Düsterhus wrote:
> Hi
>
> Am 2026-04-18 08:06, schrieb Barel:

>> I am still unconvinced about this. Your proposal seems to give the 
>> `null`
>> a special value and I think that in general the full semantics are less
>
> null being a value indicating absence is by no means “special” in my 
> suggestion. As previously mentioned, it's the semantics of `isset()`. 
> It's also what `array_find()` and `array_find_key()` return. It has 
> special syntax in types with the questionmark in `?Type`. It's what you 
> get when you read a non-existent value.
>
>> clear. And I don't really like the function throwing errors for paths, 
>> I
>> think that this function is great for defensive access to values, where 
>> you
>> can be sure that you don't need to be checking the path all the time. 
>> The
>
> Defensive access to me also implies throwing errors *where appropriate*, 
> namely trying to perform an operation that is not meaningful. Trying to 
> access an array offset on a string is not meaningful and trying to do 
> *something* is not likely what the user intended to do. Similarly users 
> passing in `ArrayAccess` objects might reasonably expect them to “just 
> work”. Returning a default value instead of a clear error will likely 
> lead to them thinking they found a bug in PHP.

Just to make sure we're talking about the same thing here.  Tim, you're 
suggesting that this:

$a = ['foo' => 'bar'];
$val = array_path_get($a, ['foo', 'bar', 'baz']);

Should error rather than returning null?

If so, then I do not agree.  The purpose of these functions, as I see it, is 
for dealing with inconsistently structured, wonky, arguably stupidly-designed 
data.  (Which is a lot of REST APIs in the wild, sadly.)  If the array were 
clearly, consistently, and properly structured, we could reliably just do 
$a['foo']['bar'] and move on with life.  Or trivially convert it to a properly 
typed object.  These functions are for cases where those are not viable or 
convenient options, meaning cases where a given value could be a string or an 
array, because the data model author hates you.  (As noted in a previous reply, 
I have run into such structures where the value of a JSON key is 
string|string{}.  It bloody well sucks.)

So in that sort of case, I'm not sure it's useful to distinguish between "There 
is no baz key on the array at foo.bar" and "foo.bar is a string, not an array, 
wat?"  If that was a distinction that mattered, I'd be using ?? or converting 
to an object or whatever else already.

--Larry Garfield

Reply via email to