]> granicus.if.org Git - php/commitdiff
Fix #46813 (class_exists doesn`t work with fully qualified namespace)
authorJohannes Schlüter <johannes@php.net>
Tue, 9 Dec 2008 19:16:22 +0000 (19:16 +0000)
committerJohannes Schlüter <johannes@php.net>
Tue, 9 Dec 2008 19:16:22 +0000 (19:16 +0000)
Zend/tests/bug46813.phpt [new file with mode: 0644]
Zend/zend_builtin_functions.c

diff --git a/Zend/tests/bug46813.phpt b/Zend/tests/bug46813.phpt
new file mode 100644 (file)
index 0000000..fb81788
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #46813: class_exists doesn`t work with fully qualified namespace
+--FILE--
+<?php
+namespace test;
+{
+       class inner
+       {
+               
+       }
+}
+
+$inner = new \test\inner();
+
+echo "autoload == true:\n";
+var_dump(class_exists('\test\inner', true));
+var_dump(class_exists(b'\test\inner', true));
+echo "autoload == false:\n";
+var_dump(class_exists('\test\inner', true));
+var_dump(class_exists(b'\test\inner', true));
+?>
+--EXPECT--
+autoload == true:
+bool(true)
+bool(true)
+autoload == false:
+bool(true)
+bool(true)
index 58bc1292f5fe6e96f4e394fa85b7cbaa437938cf..d12bb127c4b517fcb5e2ad5e77c00120b8f92d1a 100644 (file)
@@ -1160,8 +1160,24 @@ ZEND_FUNCTION(class_exists)
        }
 
        if (!autoload) {
+               zstr name;
+               int len;
+
                lc_name = zend_u_str_case_fold(type, class_name, class_name_len, 1, &lc_name_len);
-               found = zend_u_hash_find(EG(class_table), type, lc_name, lc_name_len+1, (void **) &ce);
+
+               /* Ignore leading "\" */
+               name = lc_name;
+               len = class_name_len;
+               if (lc_name.s[0] == '\\') {
+                       if (type == IS_UNICODE) {
+                               name.u = &lc_name.u[1];
+                       } else {
+                               name.s = &lc_name.s[1];
+                       }
+                       len--;
+               }
+
+               found = zend_u_hash_find(EG(class_table), type, name, len+1, (void **) &ce);
                efree(lc_name.v);
                RETURN_BOOL(found == SUCCESS && !((*ce)->ce_flags & ZEND_ACC_INTERFACE));
        }