{ public static final function getInstance() { return parent::getInstance(); } public static final function removeInstance() { parent::removeInstance(); } } //using class FirstProduct extends Factory { public $keys = []; } class SecondProduct extends FirstProduct { } FirstProduct::getInstance()->keys[] = 1; SecondProduct::getInstance()->keys[] = 2; FirstProduct::getInstance()->keys[] = 3; SecondProduct::getInstance()->keys[] = 4; FirstProduct::getInstance()->keys[] = 5; var_dump(FirstProduct::getInstance()->keys); var_dump(SecondProduct::getInstance()->keys); var_dump(FactoryAbstract::getInstanceList()); FirstProduct::removeInstance(); var_dump(FactoryAbstract::getInstanceList()); var_dump(FirstProduct::getInstance()->keys); var_dump(SecondProduct::getInstance()->keys); var_dump(FactoryAbstract::getInstanceList());
self::$instances[$class] = new $class(); } return self::$instances[$class]; } protected static final function getClassName() { return get_called_class(); } } abstract class Factory extends FactoryAbstract { public static final function getInstance() { return parent::getInstance(); } } class FirstProduct extends Factory { public $a = []; } class SecondProduct extends FirstProduct { } FirstProduct::getInstance()->a[] = 1; SecondProduct::getInstance()->a[] = 2; FirstProduct::getInstance()->a[] = 3; SecondProduct::getInstance()->a[] = 4; print_r(FirstProduct::getInstance()->a); // array(1, 3) print_r(SecondProduct::getInstance()->a); // array(2, 4)