]> granicus.if.org Git - php/commitdiff
- Fix scoping issue. The following works now:
authorAndi Gutmans <andi@php.net>
Wed, 26 Dec 2001 20:17:34 +0000 (20:17 +0000)
committerAndi Gutmans <andi@php.net>
Wed, 26 Dec 2001 20:17:34 +0000 (20:17 +0000)
<?
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";

Zend/zend_execute.c
Zend/zend_execute_API.c

index 5af6971af133578a5f7bb99950f8be22135a93d2..cf9c4b42e44f3b20e069dd9bf7f872ac1e32f25b 100644 (file)
@@ -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);
index e9719e028799d9a08c75e7e6eb81163ffd4450c9..834ec351eef1fb8551a527052d8f871e8a7f16e4 100644 (file)
@@ -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;
 }