php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #49143 is_callable() and unnecessary backslash
Submitted: 2009-08-03 16:19 UTC Modified: 2010-06-11 00:53 UTC
Votes:2
Avg. Score:3.5 ± 1.5
Reproduced:2 of 2 (100.0%)
Same Version:2 (100.0%)
Same OS:2 (100.0%)
From: david at grudl dot com Assigned: felipe (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 5.3.0 OS: *
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: david at grudl dot com
New email:
PHP Version: OS:

 

 [2009-08-03 16:19 UTC] david at grudl dot com
Description:
------------
is_callable() and method_exists() may invoke autoloader with  unnecessary namespace backslash.

\My\MyClass::func() is the same as My\MyClass::func().





Reproduce code:
---------------
function __autoload($name)
{
	echo $name;
}

is_callable('\My\MyClass::func'); // ERROR

is_callable('My\MyClass::func'); // OK

method_exists('\My\MyClass', 'func'); // ERROR

method_exists('My\MyClass', 'func'); // OK

// defined works well:
defined('\My\MyClass::CONST'); // OK

defined('My\MyClass::CONST'); // OK



Expected result:
----------------
My\MyClass
My\MyClass

My\MyClass
My\MyClass

My\MyClass
My\MyClass

Actual result:
--------------
\My\MyClass
My\MyClass

\My\MyClass
My\MyClass

My\MyClass
My\MyClass

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-08-04 00:34 UTC] david at grudl dot com
Tested with 5.3.1-dev (Sun, 02 Aug 2009 18:53:57 +0000), problem still 
exists.
 [2009-08-04 11:16 UTC] jani@php.net
Yes, which problem..? I don't see any errors. 
 [2009-08-04 11:24 UTC] david at grudl dot com
The two same class invokes autoloader with different class name (maybe 
better term is non-canonicalized class name).

This means: every autoloader must call $name = ltrim($name, "\").

defined() removes leading "\" automatically, is_callable and 
method_exists do not.
 [2010-04-09 08:18 UTC] abca_b_cabcom at hotmail dot com
hi david, you are not in a namespace it is just a classname.
 [2010-06-11 00:48 UTC] alex dot howansky at gmail dot com
This bug is still present in 5.3.2 and also affects instantiating a new class 
from a string variable:

function __autoload($class)
{
    echo "$class\n";
}

$obj = new MyProject\Thing();
// correct: MyProject\Thing

$obj = new \MyProject\Thing();
// correct: MyProject\Thing

$class = '\\MyProject\\Thing';
$obj = new $class();
// wrong: \MyProject\Thing
 [2010-06-11 00:52 UTC] felipe@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: felipe
 [2010-06-11 00:52 UTC] felipe@php.net
This already was fixed for the next release.
See bug #50731

Thanks.
 [2010-06-11 00:53 UTC] felipe@php.net
-Package: Class/Object related +Package: Scripting Engine problem
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Nov 24 03:01:32 2024 UTC