php - How to prevent sharing of static variables in inherited classes? -


consider model.php:

class model {     protected static $class_name;     protected static $table_name;      protected $id;      public static function initialize() {         static::$class_name = get_called_class();         static::$table_name = strtolower(static::$class_name).'s';     } } 

and children, user.php , product.php:

class user extends model {     protected $username;     protected $password; } user::initialize();  class product extends model {     protected $name;     protected $price; } product::initialize(); 

since every user or product have same $class_name , $table_name, makes sense make them static. actual values assigned when initialize() method called on child model (e.g. user::initialize(); , product::initialize();).

problem

i expect end following:

user    -> $class_name -> 'user',    $table_name -> 'users' product -> $class_name -> 'product', $table_name -> 'products' 

yet following:

user    -> $class_name -> 'user',    $table_name -> 'users' product -> $class_name -> 'user',    $table_name -> 'users' 

how possible given using late static binding static::? , how can fixed? goal user , product have independent class_name , table_name, still keep both variables static, without redeclaring them on each model, user, product or other!

when product::initialize called, model::$class_name set "product" , model::$table_name "products". when user::initialize called, model::$class_name , model::$table_name overwritten "user" , "users".

the static in initialize make difference, if attributes defined in sub classes.

the second part of question answered yourself, either redeclare them or make them non-static.

edit

you use map in combination accessors fake sub-class local inherited static properties (i hope made up).

class foo {         private static $class_names = [];         private static $table_names = [];          public static function getclassname() {                 return self::$class_names[static::class];         }          public static function gettablename() {                 return self::$table_names[static::class];         }          public static function initialize() {                 self::$class_names[static::class] = static::class;                 self::$table_names[static::class] = strtolower(static::class).'s';         } }  class bar extends foo { } bar::initialize();  class baz extends foo { } baz::initialize();  echo bar::gettablename() . " " . bar::getclassname() . "\n"; echo baz::gettablename() . " " . baz::getclassname() . "\n"; 

declaring dynamic static properties sadly not work in php 7.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -