Выполните метод один раз для каждого дочернего класса

Я пытаюсь казнить initialize() метод для каждого класса, который выходит из базового класса, используя поздние статические привязки:

class BaseClass
{
protected static $initialized = false;

public static function find()
{
static::initialize();
//TODO search entries and return as instances...
}

protected static function initialize()
{
if (static::$initialized)
return;

echo 'Initializing ', static::class, '<br/>';
//do important stuff
static::$initialized = true;
}
}

class Child1 extends BaseClass {}
class Child2 extends BaseClass {}

$initialized свойство распределяется между расширяющимися классами.

Child1::find(); //Outputs 'Initializing Child1', as expected
Child2::find(); //Doesn't execute 'initialize()' because
//$initialized property was set to true by Child1
//Expected: 'Initializing Child2'

Есть ли простой способ добиться этого?

0

Решение

Вы можете изменить $ initialized на массив (как предложено в комментарии), используя имена классов в качестве ключей:

class BaseClass
{
protected static $initialized = [];

public static function find()
{
return static::initialize();
}

protected static function initialize()
{
$class_name = static::class;
if (!empty(static::$initialized[$class_name])) {
return static::$initialized[$class_name];
}

echo 'Initializing ', $class_name, '<br/>';
//do important stuff
static::$initialized[$class_name] = new static();
// do another important stuff and return instance
return static::$initialized[$class_name];
}
}

class Child1 extends BaseClass {}
class Child2 extends BaseClass {}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]