Edit report at https://bugs.php.net/bug.php?id=61467&edit=1
ID: 61467
User updated by: david at grudl dot com
Reported by: david at grudl dot com
Summary: New "callable" typehint does not work (autoloading)
-Status: Feedback
+Status: Open
Type: Bug
Package: Class/Object related
PHP Version: 5.4.0
Block user comment: N
Private report: N
New Comment:
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?
Previous Comments:
------------------------------------------------------------------------
[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
------------------------------------------------------------------------
[2012-03-21 20:25:04] david at grudl dot com
do -> does
------------------------------------------------------------------------
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