0

問題は、A、B、C の 3 つのクラスがあるとします。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 の id の名前が異なります。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;
}

しかし、うまくいきません。では、この設計を解決するのを手伝ってくれる人はいますか?

4

1 に答える 1

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;
  }
}

変数 variable で探していた構文は次のとおりです。

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

ただし、代わりにオーバーロード可能なメソッドを使用することをお勧めします。これにより、長期的にはより多くの制御が可能になります。「インターフェース」は、変数名ではなく、呼び出し可能な関数によって定義するのが最適です。これをすべて静的に行うことが最初から良い考えであるかどうかは、別の議論です。

于 2015-02-09T04:35:41.887 に答える