- Added long-option feature to getopt() and made getopt() available also on
win32 systems by adding a common getopt implementation into core.
(David Soria Parra, Jani)
-- Added support for namespaces. (Dmitry, Stas)
+- Added support for namespaces. (Dmitry, Stas, Gregory)
- Added support for Late Static Binding. (Dmitry, Etienne Kneuss)
- Added support for __callstatic() magic method. (Sara)
- Added support for dynamic access of static members using $foo::myFunc().
--- /dev/null
+--TEST--
+060: multiple namespaces per file
+--FILE--
+<?php
+namespace Foo;
+use Bar::A as B;
+class A {}
+$a = new B;
+$b = new A;
+echo get_class($a)."\n";
+echo get_class($b)."\n";
+namespace Bar;
+use Foo::A as B;
+$a = new B;
+$b = new A;
+echo get_class($a)."\n";
+echo get_class($b)."\n";
+class A {}
+--EXPECT--
+Bar::A
+Foo::A
+Foo::A
+Bar::A
CG(active_op_array)->opcodes[num-1].opcode == ZEND_TICKS)) {
--num;
}
- if (num > 0) {
+ if (!CG(current_namespace) && num > 0) {
zend_error(E_COMPILE_ERROR, "Namespace declaration statement has to be the very first statement in the script");
}
}
- if (CG(current_namespace)) {
- zend_error(E_COMPILE_ERROR, "Namespace cannot be declared twice");
- }
lcname = zend_str_tolower_dup(Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant));
if (((Z_STRLEN(name->u.constant) == sizeof("self")-1) &&
!memcmp(lcname, "self", sizeof("self")-1)) ||
}
efree(lcname);
- ALLOC_ZVAL(CG(current_namespace));
+ if (CG(current_namespace)) {
+ zval_dtor(CG(current_namespace));
+ } else {
+ ALLOC_ZVAL(CG(current_namespace));
+ }
+ if (CG(current_import)) {
+ zend_hash_destroy(CG(current_import));
+ efree(CG(current_import));
+ CG(current_import) = NULL;
+ }
+
*CG(current_namespace) = name->u.constant;
}
/* }}} */
{
if (CG(current_namespace)) {
zval_dtor(CG(current_namespace));
- efree(CG(current_namespace));
+ FREE_ZVAL(CG(current_namespace));
CG(current_namespace) = NULL;
}
if (CG(current_import)) {