【问题标题】:How can I late static binding in inherited class with variable variables of PHP如何在继承类中延迟静态绑定与 PHP 的变量变量
【发布时间】:2015-02-09 03:54:54
【问题描述】:

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

但它不起作用。那么有人可以帮我解决这个设计吗?

【问题讨论】:

  • 我认为你把一切都复杂化了。除非您需要将B::$idB::$id_B 分开使用,否则定义后者的原因是什么?只需使用$id
  • 我想写一个数据库类作为A,这样如果我的伙伴想控制数据库,他可以只创建像B和C这样的继承类来对数据库进行CRUD,而无需编写相同的CRUD代码。但问题是数据库中的 id 名称可能不同,例如 id_student、id_player。所以这让我很挣扎。

标签: php class reference variable-variables late-static-binding


【解决方案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;

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

【讨论】:

  • 这正是我想要的。谢谢!
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2011-04-24
  • 2012-02-18
  • 2019-04-28
  • 2011-03-29
相关资源
最近更新 更多