Bug #61467 [Opn->Nab]: New "callable" typehint does not work (autoloading)

From: Date: Fri, 23 Mar 2012 13:35:48 +0000
Subject: Bug #61467 [Opn->Nab]: New "callable" typehint does not work (autoloading)
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-168762@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=61467&edit=1

 ID:                 61467
 Updated by:         rasmus@php.net
 Reported by:        david at grudl dot com
 Summary:            New "callable" typehint does not work (autoloading)
-Status:             Open
+Status:             Not a bug
 Type:               Bug
 Package:            Class/Object related
 PHP Version:        5.4.0
 Block user comment: N
 Private report:     N

 New Comment:

Well, that's a very subjective thing. callable matches the default behaviour of 
is_callable(). In most cases when you pass a callable it is going to get called. 
If you want to implement lazy loading it is simple enough to do an is_callable 
syntax-check only in your method itself. The default had to be set to one or the 
other and we tend to set things to the common use case.


Previous Comments:
------------------------------------------------------------------------
[2012-03-23 12:55:09] david at grudl dot com

I understand its behavior, but I think it is wrong. Callable shouldn't check the existence of
class, but only check argument is a syntactically correct. Otherwise it makes lazy-loading
impossible. Not every callback is called. 

In addition, the non-existence of class results in confusing error message: "must be callable,
string given". So "A::b" is not callable?

------------------------------------------------------------------------
[2012-03-23 05:18:22] rasmus@php.net

But it only triggers the autoloader when you pass it something that looks exactly 
like A::b(). In this case it will go try to load 'A' in order to see if there is 
a b() method. If you pass it array(1,2,3) it will obviously not trigger the 
autoloader so I think your assertion that this will cause "major performance 
issues" is a bit drastic.

------------------------------------------------------------------------
[2012-03-21 23:57:25] david at grudl dot com

Possible fix is to change in file zend_execute.c on line 645 flag IS_CALLABLE_CHECK_SILENT to
IS_CALLABLE_CHECK_SYNTAX_ONLY.

------------------------------------------------------------------------
[2012-03-21 21:58:51] david at grudl dot com

Sorry, in PHP 5.4 there is not "an instance of" in error message. But that's not the
point.

------------------------------------------------------------------------
[2012-03-21 20:49:54] rasmus@php.net

Are you sure you are running 5.4? Your your test script:

% php53 test.php

Catchable fatal error: Argument 1 passed to test() must be an instance of 
callable, array given, called in /home/rasmus/r on line 6 and defined in 
/home/rasmus/r on line 2

% php54 test.php

Catchable fatal error: Argument 1 passed to test() must be callable, array 
given, called in /home/rasmus/r on line 6 and defined in /home/rasmus/r on line 
2

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=61467


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61467&edit=1


Thread (18 messages)

« previous php.bugs (#168762) next »