我如何在继承的 class 中使用 PHP 的可变变量延迟静态绑定

How can I late static binding in inherited class with variable variables of PHP

问题是,假设我们有三个 classes 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中的id名称不同。 B是id_B,C是id_C。 class A 是一种接口,所以它只知道继承的 class 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;
}

但是没用。那么有谁能帮我解决这个设计吗?

是的,它只是行不通。您要么知道要访问什么变量,要么将其留给个性化代码来执行。例如:

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;

但我建议改用可重载方法,这样可以让您在长 运行 中获得更多控制权。 "Interfaces" 最好由可调用函数定义,而不是变量名。静态地做这一切是否是一个好主意是一个不同的讨论。