--- /dev/null
+--TEST--
+Bug #42820 (defined() on constant with namespace prefixes tries to load class)
+--FILE--
+<?php
+namespace ns;
+const ok = 0;
+class foo {
+ const ok = 0;
+}
+var_dump(defined('ns::ok'));
+var_dump(defined('ns::bug'));
+var_dump(defined('::ns::ok'));
+var_dump(defined('::ns::bug'));
+var_dump(defined('ns::foo::ok'));
+var_dump(defined('ns::foo::bug'));
+var_dump(defined('::ns::foo::ok'));
+var_dump(defined('::ns::foo::bug'));
+var_dump(defined('ns::bar::bug'));
+var_dump(defined('::ns::bar::bug'));
+--EXPECT--
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+
}
convert_to_text_ex(var);
- if (zend_u_get_constant_ex(Z_TYPE_PP(var), Z_UNIVAL_PP(var), Z_UNILEN_PP(var), &c, NULL, 0 TSRMLS_CC)) {
+ if (zend_u_get_constant_ex(Z_TYPE_PP(var), Z_UNIVAL_PP(var), Z_UNILEN_PP(var), &c, NULL, ZEND_FETCH_CLASS_SILENT TSRMLS_CC)) {
zval_dtor(&c);
RETURN_TRUE;
} else {
#define ZEND_FETCH_CLASS_AUTO 5
#define ZEND_FETCH_CLASS_INTERFACE 6
#define ZEND_FETCH_CLASS_STATIC 7
-#define ZEND_FETCH_CLASS_FLAGS 0xF0
+#define ZEND_FETCH_CLASS_MASK 0x0f
#define ZEND_FETCH_CLASS_NO_NORMALIZE 0x10
#define ZEND_FETCH_CLASS_RT_NS_CHECK 0x20
#define ZEND_FETCH_CLASS_RT_NS_NAME 0x40
#define ZEND_FETCH_CLASS_NO_AUTOLOAD 0x80
+#define ZEND_FETCH_CLASS_SILENT 0x0100
/* variable parsing type (compile-time) */
#define ZEND_PARSED_MEMBER (1<<0)
name.u[1] == ':') {
name.u += 2;
name_len -= 2;
- flags = 0;
+ flags &= ZEND_FETCH_CLASS_SILENT;
} else if (type == IS_STRING &&
name.s[0] == ':' &&
name.s[1] == ':') {
name.s += 2;
name_len -= 2;
- flags = 0;
+ flags &= ZEND_FETCH_CLASS_SILENT;
}
if ((UG(unicode) && (colon.u = u_memrchr(name.u, ':', name_len)) && colon.u > name.u && *(colon.u-1) == ':') ||
retval = 1;
return zend_u_get_constant(type, name, name_len, result TSRMLS_CC);
}
- zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+ if ((flags & ZEND_FETCH_CLASS_SILENT) == 0) {
+ zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+ }
}
retval = 0;
}
int use_autoload = (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) ? 0 : 1;
int do_normalize = (fetch_type & ZEND_FETCH_CLASS_NO_NORMALIZE) ? 0 : 1;
int rt_ns_check = (fetch_type & ZEND_FETCH_CLASS_RT_NS_CHECK) ? 1 : 0;
+ int silent = (fetch_type & ZEND_FETCH_CLASS_SILENT) != 0;
zstr lcname = class_name;
- fetch_type = fetch_type & ~ZEND_FETCH_CLASS_FLAGS;
+ fetch_type &= ZEND_FETCH_CLASS_MASK;
check_fetch_type:
switch (fetch_type) {
}
return *pce;
}
- if (fetch_type == ZEND_FETCH_CLASS_INTERFACE) {
- zend_error(E_ERROR, "Interface '%R' not found", type, class_name);
- } else {
- zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+ if (!silent) {
+ if (fetch_type == ZEND_FETCH_CLASS_INTERFACE) {
+ zend_error(E_ERROR, "Interface '%R' not found", type, class_name);
+ } else {
+ zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+ }
}
}
if (lcname.v != class_name.v) {