Как я могу задержать статическое связывание в унаследованном классе с переменными переменными Stack Overflow

Дело в том, что у нас есть три класса A, B и C. B и C наследуются от A.

<?php
class A{
public static function update(){
static::$id = 1;
}
}

class B extends A{
public static $id_B;
}

class C extends A{
public static $id_C;
}

A::update();

?>

По каким-либо причинам имена идентификаторов в B и C различаются. B — это id_B, а C — это id_C. Класс A является своего рода интерфейсом, поэтому он просто знает, что унаследованные классы B и C должны иметь переменную $ id. A хочет обновить $ id до 1. То, что я хочу, это попытаться обновить $ id_B и $ id_C до 1. Я попробовал несколько методов, таких как установка переменных переменных, например:

class A{
public static function update(){
static::$$id_name = 1;
}
}

class B extends A{
public static $id_name="id_B";
public static $id_B;
}

Но это не работает. Так кто-нибудь может помочь мне решить этот дизайн?

0

Решение

Да, просто так не работает. Либо вы знаете, к какой переменной вы хотите получить доступ, либо вы оставляете это для индивидуализированного кода. Например:

class A {
public static function update(){
static::updateId(1);
}

protected static function updateId($value) {
static::$id = $value;
}
}

class B extends A{
public static $id_B;

protected static function updateId($value) {
static::$id_B = $value;
}
}

class C extends A{
public static $id_C;

protected static function updateId($value) {
static::$id_C = $value;
}
}

Синтаксис, который вы искали с помощью переменной переменной:

static::${static::$id_name} = 1;

Но я бы предложил вместо этого использовать перегружаемые методы, которые дают вам больше контроля в долгосрочной перспективе. «Интерфейсы» лучше всего определяются вызываемыми функциями, а не именами переменных. Хорошая идея начать с того, делать ли все это статически, — это другое обсуждение.

1

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

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

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