I can understand that some people coming from C++, Java may be shocked by
the behavior of a static variable in a static function.
And the need to improve things.

Maybe can you add *virtual static* keywords as a replacement for old
behavior in your RFC <https://wiki.php.net/rfc/static_variable_inheritance>
. You would satisfy me.

class A {
    static function Counter() {
        static $count = 0;
        virtual static $i = 1;
        return [++$count, $i++];
    }
}
class B extends A {}

var_dump(A::Counter()); // array(int(1), int(1))
var_dump(A::Counter()); // array(int(2), int(2))
var_dump(B::Counter()); // array(int(3), int(1))
var_dump(B::Counter()); // array(int(4), int(2))

A::Counter::$count = 665; // Great Feature

A::Counter::$i = 0; //Initialize

B::Counter::$i = 0; //Reset


In C Poo we could get :

/*header*/
typedef struct _A {// Instance class A
} A;
typedef struct _AClass {// vtable class A

  int counter_i;// php: virtual static $i

  void (*counter)(void);// php: public static function counter(){}

} AClass;

typedef struct _B {// Instance class B  A parent_instance;
} B;
typedef struct _BClass {// vtable class B  AClass parent_class;// B
contains its own virtual static variable $i
} BClass;

/*source*/

int A_counter_count = 0;// What did you expect ?
//...

A_counter_count = 665;// php: A::Counter::$count=665;

A_class_entity.i = 0;// php: A::Counter::$i=0;

B_class_entity.i = 0;// php: B::Counter::$i=0;



Best regards,

Serge




Le mar. 23 févr. 2021 à 15:02, Nikita Popov <nikita....@gmail.com> a écrit :

> Hi internals,
>
> While looking into various issues related to static variable handling, I've
> become increasingly convinced that our handling of static variables in
> inherited methods is outright buggy. However, it's also long-standing
> behavior, so I've put up an RFC:
>
> https://wiki.php.net/rfc/static_variable_inheritance
>
> Regards,
> Nikita
>

Reply via email to