Edit report at https://bugs.php.net/bug.php?id=61467&edit=1
ID: 61467 Updated by: ras...@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] ras...@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] ras...@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