【问题标题】:Extending PHP classes扩展 PHP 类
【发布时间】:2012-07-31 12:30:54
【问题描述】:

我的 PHP 项目中的每个 MySQL 表都有一个单独的类。该类将是这样的:

class students  {

  public static function find_all() {
        return self::sql_finder("SELECT * FROM ".get_class());
  }

}

我对项目中几乎所有的表都使用相同的类,除了我将类名更改为表名。现在你可以看到我在类中使用的函数中使用了“get_class()”,所以SQL从类名中获取表名。

由于我在所有类中使用的类中的函数太多,我计划用子类扩展该类,如下所示:

class  class_with_all_the_common_functions {
 public static function find_all() {
        return self::sql_finder("SELECT * FROM ".get_class());
  }
}

class student extends class_with_all_the_common_functions {
 // some table specific functions
}

现在当我使用student::find_all() 时,它会显示错误:

Database query failed: Table 'dr.class_with_all_the_common_functions
doesn't exist

我认为这很清楚,我希望find_all() 在班级学生中执行时执行。这是否可以通过后期静态绑定实现?

【问题讨论】:

  • 你试过后期静态绑定了吗? static::sql_finder() 而不是 self::sql_finder() ?
  • 嗨,纳文。我可以请您尝试将“I”大写并在可能的情况下格式化代码块/内联吗?使其尽可能具有可读性可以帮助每个人,包括那些第一语言不是英语的人。谢谢!
  • 嗨halfer,我是新手,事实上这是我的第一个问题,以后会考虑你的话,谢谢
  • Yazmat ,我试过还是没用,反正我的代码中好像缺少 get_call_class() ,下面有好人说清楚了

标签: php late-static-binding


【解决方案1】:

您会发现与此相关的两件事:

  • get_called_class() 而不是 get_class()
  • static::foo() 而不是 self::foo()

【讨论】:

    【解决方案2】:

    您可以使用get_class(parent) 或使用表名创建私有字段并仅在必要时对其进行重载:

    class A {
        private $table = 'A';
    }
    
    class B extends A {
        public function getTable() {
            return $this->table; //will return 'A'
        }
    }
    

    【讨论】:

    • 并没有真正回答这个问题,尽管我确实认为非静态解决方案通常更可取。
    猜你喜欢
    • 2012-06-27
    • 2013-02-06
    • 2017-01-09
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多