mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
- Fix scoping issue. The following works now:
<? class MyClass { static $id = 0; function MyClass() { $this->id = self::$id++; } function _clone() { $this->name = $clone->name; $this->address = "New York"; $this->id = self::$id++; } } $obj = new MyClass(); $obj->name = "Hello"; $obj->address = "Tel-Aviv"; print $obj->id; print "\n"; $obj = $obj->_clone(); print $obj->id; print "\n"; print $obj->name; print "\n"; print $obj->address; print "\n";
This commit is contained in:
parent
b04acdadf4
commit
5cb454a8ad
@ -1556,6 +1556,7 @@ binary_assign_op_addr: {
|
||||
EX(object).ptr = this_ptr;
|
||||
}
|
||||
EX(fbc) = Z_OBJCE_P(EX(object).ptr)->constructor;
|
||||
EX(calling_namespace) = Z_OBJCE_P(EX(object).ptr);
|
||||
NEXT_OPCODE();
|
||||
}
|
||||
function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
|
||||
|
@ -440,6 +440,8 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun
|
||||
int (*orig_unary_op)(zval *result, zval *op1);
|
||||
int (*orig_binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC);
|
||||
zval function_name_copy;
|
||||
zend_class_entry *current_namespace;
|
||||
zend_class_entry *calling_namespace = NULL;
|
||||
|
||||
*retval_ptr_ptr = NULL;
|
||||
|
||||
@ -464,6 +466,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun
|
||||
if (object_pp) {
|
||||
if (Z_TYPE_PP(object_pp) == IS_OBJECT) {
|
||||
function_table = &Z_OBJCE_PP(object_pp)->function_table;
|
||||
calling_namespace = Z_OBJCE_PP(object_pp);
|
||||
} else if (Z_TYPE_PP(object_pp) == IS_STRING) {
|
||||
zend_class_entry *ce;
|
||||
char *lc_class;
|
||||
@ -477,6 +480,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun
|
||||
return FAILURE;
|
||||
|
||||
function_table = &ce->function_table;
|
||||
calling_namespace = ce;
|
||||
object_pp = NULL;
|
||||
} else
|
||||
return FAILURE;
|
||||
@ -535,6 +539,9 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun
|
||||
|
||||
EG(function_state_ptr) = &function_state;
|
||||
|
||||
current_namespace = EG(namespace);
|
||||
EG(namespace) = calling_namespace;
|
||||
|
||||
if (function_state.function->type == ZEND_USER_FUNCTION) {
|
||||
calling_symbol_table = EG(active_symbol_table);
|
||||
if (symbol_table) {
|
||||
@ -581,6 +588,8 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun
|
||||
zend_ptr_stack_clear_multiple(TSRMLS_C);
|
||||
EG(function_state_ptr) = original_function_state_ptr;
|
||||
|
||||
EG(namespace) = current_namespace;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user