Re: about final methods and attributes
| From: | (Marcus B�rger) | Date: | Sat, 21 Jun 2003 19:08:03 +0000 |
| Subject: | Re: about final methods and attributes | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-2504@lists.php.net to get a copy of this message | ||
Hello Cristiano,
Saturday, June 21, 2003, 2:07:09 AM, you wrote:
MB> Hello Cristiano,
MB> Friday, June 20, 2003, 9:03:33 PM, you wrote:
CD>> Ok, final methods and attributes are cool, but what about final classes ?
CD>> Is it hard to implement ? Or all classes must be able to be extended by
CD>> children ?
MB> It would be easy to implement and i made a running patch some time back. But
MB> we were uncertain about the result, whether or not it is really helpfull and
MB> needed in a loose typed language as PHP. But if you come up with a very good
MB> scenario were final classes are really needed chances are good they make it
MB> into PHP 5, if not chances are not so good.
Attached is a patch that allows final classes.
--
Best regards,
Marcus mailto:helly@php.net
? Zend/teststest.txt Index: Zend/zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.428 diff -u -p -r1.428 zend_compile.c --- Zend/zend_compile.c 15 Jun 2003 13:58:50 -0000 1.428 +++ Zend/zend_compile.c 21 Jun 2003 19:02:17 -0000 @@ -1834,6 +1834,9 @@ void zend_do_inheritance(zend_class_entr && !(parent_ce->ce_flags & ZEND_ACC_INTERFACE)) { zend_error(E_ERROR, "Interface %s may not inherit from class (%s)", ce->name, parent_ce->name); } + if (parent_ce->ce_flags & ZEND_ACC_FINAL_CLASS) { + zend_error(E_ERROR, "Class %s may not inherit from final class (%s)", ce->name, parent_ce->name); + } ce->parent = parent_ce; /* Inherit interfaces */ Index: Zend/zend_compile.h =================================================================== RCS file: /repository/ZendEngine2/zend_compile.h,v retrieving revision 1.243 diff -u -p -r1.243 zend_compile.h --- Zend/zend_compile.h 10 Jun 2003 20:03:24 -0000 1.243 +++ Zend/zend_compile.h 21 Jun 2003 19:02:17 -0000 @@ -99,6 +99,7 @@ typedef struct _zend_brk_cont_element { #define ZEND_ACC_FINAL 0x04 #define ZEND_ACC_INTERFACE 0x08 #define ZEND_ACC_ABSTRACT_CLASS 0x10 +#define ZEND_ACC_FINAL_CLASS 0x20 /* The order of those must be kept - public < protected < private */ #define ZEND_ACC_PUBLIC 0x100 Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.119 diff -u -p -r1.119 zend_language_parser.y --- Zend/zend_language_parser.y 15 Jun 2003 13:58:50 -0000 1.119 +++ Zend/zend_language_parser.y 21 Jun 2003 19:02:18 -0000 @@ -277,6 +277,7 @@ unticked_class_declaration_statement: class_entry_type: T_CLASS { $$.u.constant.value.lval = 0; } | T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_ABSTRACT_CLASS; } + | T_FINAL T_CLASS { $$.u.constant.value.lval = ZEND_ACC_FINAL_CLASS; } | T_INTERFACE { $$.u.constant.value.lval = ZEND_ACC_INTERFACE; } ;
? Zend/teststest.txt Index: Zend/zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.428 diff -u -p -r1.428 zend_compile.c --- Zend/zend_compile.c 15 Jun 2003 13:58:50 -0000 1.428 +++ Zend/zend_compile.c 21 Jun 2003 19:02:17 -0000 @@ -1834,6 +1834,9 @@ void zend_do_inheritance(zend_class_entr && !(parent_ce->ce_flags & ZEND_ACC_INTERFACE)) { zend_error(E_ERROR, "Interface %s may not inherit from class (%s)", ce->name, parent_ce->name); } + if (parent_ce->ce_flags & ZEND_ACC_FINAL_CLASS) { + zend_error(E_ERROR, "Class %s may not inherit from final class (%s)", ce->name, parent_ce->name); + } ce->parent = parent_ce; /* Inherit interfaces */ Index: Zend/zend_compile.h =================================================================== RCS file: /repository/ZendEngine2/zend_compile.h,v retrieving revision 1.243 diff -u -p -r1.243 zend_compile.h --- Zend/zend_compile.h 10 Jun 2003 20:03:24 -0000 1.243 +++ Zend/zend_compile.h 21 Jun 2003 19:02:17 -0000 @@ -99,6 +99,7 @@ typedef struct _zend_brk_cont_element { #define ZEND_ACC_FINAL 0x04 #define ZEND_ACC_INTERFACE 0x08 #define ZEND_ACC_ABSTRACT_CLASS 0x10 +#define ZEND_ACC_FINAL_CLASS 0x20 /* The order of those must be kept - public < protected < private */ #define ZEND_ACC_PUBLIC 0x100 Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.119 diff -u -p -r1.119 zend_language_parser.y --- Zend/zend_language_parser.y 15 Jun 2003 13:58:50 -0000 1.119 +++ Zend/zend_language_parser.y 21 Jun 2003 19:02:18 -0000 @@ -277,6 +277,7 @@ unticked_class_declaration_statement: class_entry_type: T_CLASS { $$.u.constant.value.lval = 0; } | T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_ABSTRACT_CLASS; } + | T_FINAL T_CLASS { $$.u.constant.value.lval = ZEND_ACC_FINAL_CLASS; } | T_INTERFACE { $$.u.constant.value.lval = ZEND_ACC_INTERFACE; } ;