Hello Zeev,

Tuesday, May 16, 2006, 11:08:57 PM, you wrote:

>>  Anyway it adds complexity to what you
>>have to learn about PHP. In fact seeing two visibility keywords separated
>>by a colon should be easy enough to understand for everybody.

> I'll be blunt as it's late here, but that's just ******** (decided to 
> censor myself).  I for one would never guess what it means (well 
> actually my guess would be something to do with inheritance).  Either 
> I'm an idiot, or you have a serious problem estimating what's obvious 
> and what's not...  And before you say anything, no, I'm not an idiot :)

I would never allow myself to even think that. Maybe you're right and it is
just obvious to me as i wrote the patch.

>>But noone
>>would know which side is the read and which is the write side. The keyword
>>'readable' on the otherhand would be absolutly clear even for beginners
>>after at least thinking for a second. But oh i said thinking :-)

> Again, ******** in my humble opinion.  Readable from where?  Does it 
> mean it's otherwise not readable?  Does it mean that it's not 
> writable?  From where?  How does it relate to inheritance?

Na 'readable' means readable whatever i said elsewhere, no? Not logical?

> There's no way in hell to understand it without reading up on it, 
> and  even then, it's not very easy to remember.

> You've seen today someone saying that PPP is often tricky as it 
> is.  So those 'horror stories' I'm telling are very much a 
> reality.  You're suggesting that doesn't complicate it further?  Please.

Erm i heared somebody asking for 'friend' during php 5.0 development; And it
wasn't me, i swear.

>>The patch also allows any combinations in later version should we ever want
>>to go that road which i do not see any sense in. E.g. private:public and
>>protected:public make sense to me and are often a nice optimization and
>>also a nice shortcu in development and easing the pain especially for
>>beginners or small hacked to gether stuff.

> Look, don't get me wrong, but if you pursue this private:public 
> thingie, I'll have to hurt you next time I see you :)  Just no way.

ouch!

Well, it's just a stupid patch that comes without a new keyword. Mayke it
'private readable'.

Btw, you asked for for a new visibility keyword starting with P: Promulgate,
Popularize, Proclaim, Pliable. Those are at least remotely related to what
they should express. Actually promulgate is in my humble opinion quite
close :-)

And since you get what you deserver you'll find the updated patch attached.
Before you ask making it a single keyword on its own and giving the member
private or protected write visibility is of cause very easy, too.

>>However, the reason i write this mail is that you said there could be
>>problems. Well this is deply integrated  in the handlers and they don't
>>let you out. In other words if this stuff is not working then the whole
>>PHP 5+ object model is broken. Or in other words, if this is broken alot
>>of other stuff regarding object handling is already broken.

> You're probably right about this one.  You can already return a 
> reference to a private variable today and change it.  Andi - did you 
> mean something else?

Best regards,
 Marcus

before anyone gets that wrong again, i am having fun with the patch.
Index: Zend/zend_compile.h
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.h,v
retrieving revision 1.316.2.8.2.2
diff -u -p -d -r1.316.2.8.2.2 zend_compile.h
--- Zend/zend_compile.h 11 May 2006 21:07:39 -0000      1.316.2.8.2.2
+++ Zend/zend_compile.h 16 May 2006 21:38:41 -0000
@@ -139,6 +139,10 @@ typedef struct _zend_try_catch_element {
 /* deprecation flag */
 #define ZEND_ACC_DEPRECATED 0x40000
 
+/* property handling control */
+#define ZEND_ACC_READ_ONLY  0x080000
+#define ZEND_ACC_PUB_READ   0x100000
+
 char *zend_visibility_string(zend_uint fn_flags);
 
 
Index: Zend/zend_language_parser.y
===================================================================
RCS file: /repository/ZendEngine2/zend_language_parser.y,v
retrieving revision 1.160.2.4.2.1
diff -u -p -d -r1.160.2.4.2.1 zend_language_parser.y
--- Zend/zend_language_parser.y 11 May 2006 21:07:39 -0000      1.160.2.4.2.1
+++ Zend/zend_language_parser.y 16 May 2006 21:38:41 -0000
@@ -115,7 +115,7 @@
 %token T_THROW
 %token T_USE
 %token T_GLOBAL
-%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC
+%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_PROMULGATE
 %token T_VAR
 %token T_UNSET
 %token T_ISSET
@@ -500,8 +500,9 @@ method_body:
 ;
 
 variable_modifiers:
-               non_empty_member_modifiers              { $$ = $1; }
-       |       T_VAR                                                   { 
Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; }
+               non_empty_member_modifiers                              { $$ = 
$1; }
+       |       non_empty_member_modifiers T_PROMULGATE { $$ = $1; 
Z_LVAL($$.u.constant) |= ZEND_ACC_PUB_READ; }
+       |       T_VAR                                                           
        { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; }
 ;
 
 method_modifiers:
Index: Zend/zend_language_scanner.l
===================================================================
RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
retrieving revision 1.131.2.11
diff -u -p -d -r1.131.2.11 zend_language_scanner.l
--- Zend/zend_language_scanner.l        13 Apr 2006 13:48:28 -0000      
1.131.2.11
+++ Zend/zend_language_scanner.l        16 May 2006 21:38:42 -0000
@@ -1063,6 +1063,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
        return T_PUBLIC;
 }
 
+<ST_IN_SCRIPTING>"promulgate" {
+       return T_PROMULGATE;
+}
+
 <ST_IN_SCRIPTING>"unset" {
        return T_UNSET;
 }
Index: Zend/zend_object_handlers.c
===================================================================
RCS file: /repository/ZendEngine2/zend_object_handlers.c,v
retrieving revision 1.135.2.6.2.2
diff -u -p -d -r1.135.2.6.2.2 zend_object_handlers.c
--- Zend/zend_object_handlers.c 10 May 2006 21:12:48 -0000      1.135.2.6.2.2
+++ Zend/zend_object_handlers.c 16 May 2006 21:38:42 -0000
@@ -144,20 +144,26 @@ static zval *zend_std_call_issetter(zval
        return retval;
 }
 
-static int zend_verify_property_access(zend_property_info *property_info, 
zend_class_entry *ce TSRMLS_DC)
+static int zend_verify_property_access(zend_property_info *property_info, 
zend_class_entry *ce, int read_write TSRMLS_DC)
 {
+       if (!read_write && (property_info->flags & ZEND_ACC_READ_ONLY)) {
+               return 0;
+       }
        switch (property_info->flags & ZEND_ACC_PPP_MASK) {
                case ZEND_ACC_PUBLIC:
                        return 1;
                case ZEND_ACC_PROTECTED:
-                       return zend_check_protected(ce, EG(scope));
+                       if ((property_info->flags & ZEND_ACC_PUB_READ) && 
read_write) {
+                               return 1;
+                       } else {
+                               return zend_check_protected(ce, EG(scope));
+                       }
                case ZEND_ACC_PRIVATE:
-                       if (ce==EG(scope) && EG(scope)) {
+                       if ((ce == EG(scope) && ce) || ((property_info->flags & 
ZEND_ACC_PUB_READ) && read_write)) {
                                return 1;
                        } else {
                                return 0;
                        }
-                       break;
        }
        return 0;
 }
@@ -175,7 +181,7 @@ static inline zend_bool is_derived_class
        return 0;
 }
 
-ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry 
*ce, zval *member, int silent TSRMLS_DC)
+ZEND_API struct _zend_property_info 
*zend_get_property_info_ex(zend_class_entry *ce, zval *member, int silent, int 
read_write TSRMLS_DC)
 {
        zend_property_info *property_info = NULL;
        zend_property_info *scope_property_info;
@@ -198,7 +204,7 @@ ZEND_API struct _zend_property_info *zen
                        /* if it's a shadow - go to access it's private */
                        property_info = NULL;
                } else {
-                       if (zend_verify_property_access(property_info, ce 
TSRMLS_CC)) {
+                       if (zend_verify_property_access(property_info, ce, 
read_write TSRMLS_CC)) {
                                if (property_info->flags & ZEND_ACC_CHANGED
                                        && !(property_info->flags & 
ZEND_ACC_PRIVATE)) {
                                        /* We still need to make sure that 
we're not in a context
@@ -244,6 +250,11 @@ ZEND_API struct _zend_property_info *zen
 }
 
 
+ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry 
*ce, zval *member, int silent TSRMLS_DC)
+{
+       return zend_get_property_info_ex(ce, member, silent, 0 TSRMLS_CC);
+}
+
 ZEND_API int zend_check_property_access(zend_object *zobj, char 
*prop_info_name TSRMLS_DC)
 {
        zend_property_info *property_info;
@@ -252,7 +263,7 @@ ZEND_API int zend_check_property_access(
 
        zend_unmangle_property_name(prop_info_name, &class_name, &prop_name);
        ZVAL_STRING(&member, prop_name, 0);
-       property_info = zend_get_property_info(zobj->ce, &member, 1 TSRMLS_CC);
+       property_info = zend_get_property_info_ex(zobj->ce, &member, 1, 0 
TSRMLS_CC);
        if (!property_info) {
                return FAILURE;
        }
@@ -265,7 +276,7 @@ ZEND_API int zend_check_property_access(
                        return FAILURE;
                }
        }
-       return zend_verify_property_access(property_info, zobj->ce TSRMLS_CC) ? 
SUCCESS : FAILURE;
+       return zend_verify_property_access(property_info, zobj->ce, 1 
TSRMLS_CC) ? SUCCESS : FAILURE;
 }
 
 static int zend_get_property_guard(zend_object *zobj, zend_property_info 
*property_info, zval *member, zend_guard **pguard)
@@ -318,7 +329,7 @@ zval *zend_std_read_property(zval *objec
 #endif                 
 
        /* make zend_get_property_info silent if we have getter - we may want 
to use it */
-       property_info = zend_get_property_info(zobj->ce, member, 
(zobj->ce->__get != NULL) TSRMLS_CC);
+       property_info = zend_get_property_info_ex(zobj->ce, member, 
(zobj->ce->__get != NULL), 1 TSRMLS_CC);
 
        if (!property_info || zend_hash_quick_find(zobj->properties, 
property_info->name, property_info->name_length+1, property_info->h, (void **) 
&retval) == FAILURE) {
                zend_guard *guard;
@@ -371,7 +382,7 @@ static void zend_std_write_property(zval
                member = tmp_member;
        }
 
-       property_info = zend_get_property_info(zobj->ce, member, 
(zobj->ce->__set != NULL) TSRMLS_CC);
+       property_info = zend_get_property_info_ex(zobj->ce, member, 
(zobj->ce->__set != NULL), 0 TSRMLS_CC);
 
        if (property_info && zend_hash_quick_find(zobj->properties, 
property_info->name, property_info->name_length+1, property_info->h, (void **) 
&variable_ptr) == SUCCESS) {
                if (*variable_ptr == value) {
@@ -526,7 +537,7 @@ static zval **zend_std_get_property_ptr_
        fprintf(stderr, "Ptr object #%d property: %s\n", 
Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member));
 #endif
 
-       property_info = zend_get_property_info(zobj->ce, member, 
(zobj->ce->__get != NULL) TSRMLS_CC);
+       property_info = zend_get_property_info_ex(zobj->ce, member, 
(zobj->ce->__get != NULL), 0 TSRMLS_CC);
 
        if (!property_info || zend_hash_quick_find(zobj->properties, 
property_info->name, property_info->name_length+1, property_info->h, (void **) 
&retval) == FAILURE) {
                zval *new_zval;
@@ -570,7 +581,7 @@ static void zend_std_unset_property(zval
                member = tmp_member;
        }
 
-       property_info = zend_get_property_info(zobj->ce, member, 
(zobj->ce->__unset != NULL) TSRMLS_CC);
+       property_info = zend_get_property_info_ex(zobj->ce, member, 
(zobj->ce->__unset != NULL), 0 TSRMLS_CC);
 
        if (!property_info || zend_hash_del(zobj->properties, 
property_info->name, property_info->name_length+1) == FAILURE) {
                zend_guard *guard;
@@ -849,7 +860,7 @@ ZEND_API zval **zend_std_get_static_prop
        zend_printf("Access type for %s::%s is %s\n", ce->name, property_name, 
zend_visibility_string(property_info->flags));
 #endif
 
-       if (!zend_verify_property_access(property_info, ce TSRMLS_CC)) {
+       if (!zend_verify_property_access(property_info, ce, 1 TSRMLS_CC)) {
                if (!silent) {
                        zend_error(E_ERROR, "Cannot access %s property 
%s::$%s", zend_visibility_string(property_info->flags), ce->name, 
property_name);
                }
@@ -945,7 +956,7 @@ static int zend_std_has_property(zval *o
        fprintf(stderr, "Read object #%d property: %s\n", 
Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member));
 #endif
 
-       property_info = zend_get_property_info(zobj->ce, member, 1 TSRMLS_CC);
+       property_info = zend_get_property_info_ex(zobj->ce, member, 1, 0 
TSRMLS_CC);
 
        if (!property_info || zend_hash_quick_find(zobj->properties, 
property_info->name, property_info->name_length+1, property_info->h, (void **) 
&value) == FAILURE) {
                zend_guard *guard;
Index: Zend/zend_object_handlers.h
===================================================================
RCS file: /repository/ZendEngine2/zend_object_handlers.h,v
retrieving revision 1.47.2.2.2.1
diff -u -p -d -r1.47.2.2.2.1 zend_object_handlers.h
--- Zend/zend_object_handlers.h 9 May 2006 23:53:23 -0000       1.47.2.2.2.1
+++ Zend/zend_object_handlers.h 16 May 2006 21:38:42 -0000
@@ -140,6 +140,7 @@ BEGIN_EXTERN_C()
 ZEND_API union _zend_function *zend_std_get_static_method(zend_class_entry 
*ce, char *function_name_strval, int function_name_strlen TSRMLS_DC);
 ZEND_API zval **zend_std_get_static_property(zend_class_entry *ce, char 
*property_name, int property_name_len, zend_bool silent TSRMLS_DC);
 ZEND_API zend_bool zend_std_unset_static_property(zend_class_entry *ce, char 
*property_name, int property_name_len TSRMLS_DC);
+ZEND_API struct _zend_property_info 
*zend_get_property_info_ex(zend_class_entry *ce, zval *member, int silent, int 
read_write TSRMLS_DC);
 ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry 
*ce, zval *member, int silent TSRMLS_DC);
 
 ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int 
type TSRMLS_DC);
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to