Hi,
There's been enough confusion, here's the patch again, this time against
5.3, no tests for clarity
http://pear.php.net/~greg/multi.5.3.patch.txt
This patch allows:
<?php
namespace A;
class a {}
namespace B;
class a {}
namespace A;
import B::a as b;
class c extends b;
?>
It doesn't allow:
<?php
$anycode = 1;
namespace A;
?>
so all code must have a namespace declaration. The sole purpose is to
combine files containing namespace declarations.
Greg
I support this patch 100%. I have a large application I'm rewriting to
include namespaces, however now I can no longer use my script caching
functionality (which improved performance literally about 500%) that
compiled all of my includes into one file, because many of the files
have namespaces.
Hi,
There's been enough confusion, here's the patch again, this time against
5.3, no tests for clarityhttp://pear.php.net/~greg/multi.5.3.patch.txt
This patch allows:
<?php
namespace A;
class a {}
namespace B;
class a {}
namespace A;
import B::a as b;
class c extends b;
?>It doesn't allow:
<?php
$anycode = 1;
namespace A;
?>so all code must have a namespace declaration. The sole purpose is to
combine files containing namespace declarations.Greg
plain text document attachment (multi.5.3.patch.txt)
Index: Zend/zend_compile.cRCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.647.2.27.2.41.2.28
diff -u -r1.647.2.27.2.41.2.28 zend_compile.c
--- Zend/zend_compile.c 4 Dec 2007 12:38:42 -0000 1.647.2.27.2.41.2.28
+++ Zend/zend_compile.c 4 Dec 2007 17:24:34 -0000
@@ -4722,13 +4722,10 @@
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)) ||
@@ -4738,6 +4735,16 @@
}
efree(lcname);
- if (CG(current_namespace)) {
zval_dtor(CG(current_namespace));
efree(CG(current_namespace));
- }
- if (CG(current_import)) {
zend_hash_destroy(CG(current_import));
efree(CG(current_import));
- }
- CG(current_import) = NULL;
- ALLOC_ZVAL(CG(current_namespace));
*CG(current_namespace) = name->u.constant;
}