On Tue, 11 Feb 2020 at 16:27, Levi Morrison <levi.morri...@datadoghq.com> wrote: > > I have three immediate thoughts: > > 1. It should be `fn` or `function`; reserving a new word even if it's > contextual is pointless here. > 2. It should support methods. > 3. It should return a closure, not a string. The reason is for > consistency with methods, where we want to capture the scope at the > time the closure is created, not ran. Imagine passing a private method > as a callback; if it was done via `[$obj, 'privatemethod']` then it > will fail at runtime, because the scope it's called in doesn't have > access.
Hi, Levi, 1. Yes 2. Yes, I agree 3. Wouldn't it be the opposite?. E.g: class Foo { static function run_callable(callable $callable) { $callable(); } private static function private_function() { echo "bar"; } } Foo::run_callable( [ 'Foo', 'private_function' ] ); Currently, this is valid. However, the following is fatal: class Foo { static function run_callable(callable $callable) { $callable(); } private static function private_function() { echo "bar"; } } Foo::run_callable(Closure::fromCallable(['Foo', 'private_function'])); The same with functions. If "::function" would retrieve a closure, some code could breaking when people switch string function syntax( e.g: 'strlen' ) to "::function" syntax( strlen::function ). On other hand, other option is ::callable, This is different to ::function, because it would affect to other callables, so that, returns could be other( Closure )