如何使用PHP的变量在继承类中后期进行静态绑定

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

提问人:Xinran Luo 提问时间:2/9/2015 更新时间:2/9/2015 访问量:140

问:

问题是,假设我们有三个类 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。类 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;
}

但这行不通。那么有人可以帮我解决这个设计吗?

PHP 引用 late-static-binding

评论

1赞 Marty 2/9/2015
我认为你已经把一切都复杂化了。除非你需要单独使用 to ,否则定义后者的原因是什么?只需使用 .B::$idB::$id_B$id
0赞 Xinran Luo 2/10/2015
我想将数据库类编写为 A,这样如果我的合作伙伴想要控制数据库,他只能创建继承的类(如 B 和 C)来对数据库进行 CRUD,而无需编写相同的 CRUD 代码。但问题是数据库中的 id 名称可能不同,例如 id_student、id_player。所以这让我很挣扎。

答:

1赞 deceze 2/9/2015 #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;

但我建议改用可重载的方法,从长远来看,这可以为您提供更多的控制权。“接口”最好由可调用函数定义,而不是变量名称。静态地做这一切是否是一个好主意,这是一个不同的讨论。

评论

0赞 Xinran Luo 2/10/2015
这正是我想要的。谢谢!