mirror of
https://github.com/php/php-src.git
synced 2026-04-23 16:08:35 +02: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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user