On Fri, Jul 9, 2021, at 4:51 AM, Nikita Popov wrote:
> On Fri, Jul 9, 2021 at 10:45 AM Joe Watkins <krak...@php.net> wrote:
> 
> > Morning internals,
> >
> > While discussing some of the details of the first class callable RFC, it
> > became apparent that fake closures (created by Closure::fromCallable) are
> > not currently comparable in a useful way.
> >
> > Although this is not directly related to the first class callable feature,
> > it's likely that the proliferation of this kind of code will follow, so now
> > seems like a good time to fix the problem.
> >
> > https://github.com/php/php-src/pull/7223
> >
> > Any objections to merging that in master ?
> >
> 
> To clarify: What this implements is that
> 
> $strlen1 = Closure::fromCallable('strlen');
> $strlen2 = Closure::fromCallable('strlen');
> var_dump($strlen1 == $strlen2);
> // bool(true) with this patch, previously bool(false)
> 
> The same would also apply to the first-class callable syntax, i.e. after
> this patch strlen(...) == strlen(...) would return true.
> 
> Regards,
> Nikita

Seems reasonable on the surface.  My main question is how far that extends.  
Does it work *only* for Closure::fromCallable()/FCC syntax?  What if the 
argument is not a string?  How deep does the comparison go for, say, objects 
and methods?

class C {
  public function beep(string $a): string { return $a . 'beep'; }
}

$c1 = new C();
$c2 = new C();

$strlen1 = Closure::fromCallable([$c1, 'beep']);
$strlen1b = Closure::fromCallable([$c1, 'beep']);
$strlen2 = Closure::fromCallable([$c2, 'beep']);

// What do these do?
var_dump($strlen1 == $strlen1b);
var_dump($strlen1 == $strlen2);

--Larry Garfield

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to