On Wed, 2011-06-08 at 10:38 +0200, Hannes Magnusson wrote:
> 2011/6/8 Johannes Schlüter <johan...@schlueters.de>:
> > On Tue, 2011-06-07 at 12:12 -0700, Stas Malyshev wrote:
> >> Hi!
> >>
> >> > https://wiki.php.net/rfc/callable
> >>
> >> It is good there's an RFC. However it seems to lack code examples. I
> >> understand it may be obvious to the proposers how it looks like, but
> >> it'd be nice to have the actual example there as it is done nearly
> >> everywhere else.
> >
> > The RFC is missing information about what happens in codebases which
> > already have a "callable" type declared. Will that be prevented or will
> > they hit a runtime error? ("callable expected, callable type found")
> 
> You mean an interface/class with that name?
> The error would be 'expected instanceof callable, string/array/closure 
> recieved.
> 
> gettype("strpos") will still return a string, not callable.
> 
> A callable wouldn't be fully featured type.

Which means that 
   class callable { }
   function f(callable $c) { }
   f(new callable);
will be allowed by the parser but have a "strange" result? (This isn't
the case w/ array type hints as array is a parser token and can't be
used as class name (from userland at least))

If this feature is accepted we should have a good behavior there. I'm
not sure whether the right solution is to disallow naming classes
"callable" (or "callback" or whatever the name will be in the end)

Funny thing: Google Codesearch gives me one application defining an
class Callable. In that specific case the above thing would work:
http://google.com/codesearch/p?hl=en#vA7-IQSCKhE/trunk/php/framework/project/App/util/Callable.php&q=lang:php%20%22class%20callable%22&sa=N&cd=9&ct=rc

Sidenote: Looking for "class callback" gives me more false positives,
but also a few places where that classname is being used:
http://google.com/codesearch/p?hl=en#lYWaFFstwm4/tests/cases/libs/model/models.php&q=lang:php%20%22class%20callback%22&sa=N&cd=11&ct=rc
http://google.com/codesearch/p?hl=en#PbKZfG2CZcc/trunk/phpQuery/phpQuery/Callback.php&q=lang:php%20%22class%20callback%22&sa=N&cd=12&ct=rc&l=29
http://google.com/codesearch/p?hl=en#f6tUYQTbHns/trunk/framework/activerecord/lib/CallBack.php&q=lang:php%20%22class%20callback%22&sa=N&cd=21&ct=rc
...

> > What about default values? Will
> >    function foo(callback $cb = 'strpos') { }
> > be valid?
> 
> No default values, other then NULL allowed.
> Otherwise we would need to support array("classname", "methodname")
> too, and then people would want default array values for array
> typehinting etc etc etc.

Ok. I assume NULL as default value would be allowed, though. This would
be consistent for the language and allow such things:

function foo(callback $cb = NULL) {
    if (!$cb) {
        $cb = function() { /* .. default implementation */
    }
    ....
}

> > The information on reflection is limited. what shall
> > Reflection::Parameter::getTypehint() return? Will that method allow to
> > differ between a class type and this "magic"?
> 
> There is no such method anymore :)

Good point. While I'd see that as defect, independently from scalar and
other type hints ;-)

> > What about ARGINFO? Will internal functions be able to define this type
> > via ARGINFO? How will this be reported in `php --rf function`?
> 
> I didn't include arginfo in the patch, but good point. It should
> probably be included.
> As Felipe pointed out, ext/reflection hasn't been updated.
> It should return [ callable $foobar ], just like with any other typehint

That is fine.

Having the behavior cleared I wonder how useful it is in practical
terms. A class type hint guarantees me I can do a specific call to
methods defined in the class/interface. The proposed type hint tells me
I can call it in some way. It won't ensure that the signature is
compatible with what I expect.

    function foo(callable $cb) {
        $cb();
    }
    foo("strpos"); // This one in fact is illegal but won't be prevented

But maybe this doesn't matter as type hints purely serve documentation
(as E_RECOVERABLE are useless unless we make them Exceptions ...) while
even for documentation purpose more information is needed.

johannes



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

Reply via email to