From: Zeev Suraski Date: Mon, 10 Feb 2003 09:45:27 +0000 (+0000) Subject: Add ability to reference self:: and parent:: in constant initializers X-Git-Tag: RELEASE_0_5~1160 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dbb73d8f1ee28c6b1edaaa3b630cf1dc3f5f32bf;p=php Add ability to reference self:: and parent:: in constant initializers (bug #21849) --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3693fc6397..8e4ba13a36 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2211,7 +2211,7 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS) if (EX(opline)->op1.op_type == IS_UNUSED) { if (EX(opline)->extended_value == ZEND_FETCH_CLASS_SELF) { if (!EG(scope)) { - zend_error(E_ERROR, "Cannot fetch self:: when no class scope is active"); + zend_error(E_ERROR, "Cannot access self:: when no class scope is active"); } EX_T(EX(opline)->result.u.var).EA.class_entry = EG(scope); NEXT_OPCODE(); @@ -2220,10 +2220,10 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS) NEXT_OPCODE(); } else if (EX(opline)->extended_value == ZEND_FETCH_CLASS_PARENT) { if (!EG(scope)) { - zend_error(E_ERROR, "Cannot fetch parent:: when no class scope is active"); + zend_error(E_ERROR, "Cannot access parent:: when no class scope is active"); } if (!EG(scope)->parent) { - zend_error(E_ERROR, "Cannot fetch parent:: as current class scope has no parent"); + zend_error(E_ERROR, "Cannot access parent:: when current class scope has no parent"); } EX_T(EX(opline)->result.u.var).EA.class_entry = EG(scope)->parent; NEXT_OPCODE(); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 3788ae263f..b170603bec 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -378,6 +378,23 @@ ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC) last = tsrm_strtok_r(p->value.str.val, ":", &temp); + if (strcasecmp(last, "self")==0) { + if (EG(scope)) { + last = EG(scope)->name; + } else { + zend_error(E_ERROR, "Cannot access self:: when no class scope is active"); + } + } else if (strcasecmp(last, "parent")==0) { + if (!EG(scope)) { + zend_error(E_ERROR, "Cannot access parent:: when no class scope is active"); + } else if (!EG(scope)->parent) { + zend_error(E_ERROR, "Cannot access parent:: when current class scope has no parent"); + } else { + last = EG(scope)->parent->name; + } + } + + if (zend_lookup_class(last, strlen(last), &ce TSRMLS_CC) == FAILURE) { zend_error(E_ERROR, "Undefined class '%s'", last); }