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

Дело в том, что у нас есть три класса 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;
}

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

1 ответ

Решение

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

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;

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

Другие вопросы по тегам