0

可能是一个愚蠢的问题,我在 PHP 中有很多使用这个模板的类:

class SomeTable {
    private $db;
    private $prefix;
    private $tbl_name;

    function __construct($db, $tbl_name) {
            $this->db = $db;
            $this->prefix = $db->tblPrefix();
            $this->tbl_name = $tbl_name;
            $this->install();
    }

    private function install() {
        $sql = "CREATE TABLE IF NOT EXISTS...";
        $this->db->query($sql, null);
    }

    // query functions
    ...
}
  • 我有其中一个类来表示数据库中的每个表。
  • 顶部的 3 个私有变量必须在每个类中可用,并且在构造函数中设置。
  • 每个类的构造函数都是相同的。
  • 每个类的install()函数都不同,因为它用于创建数据库表。(我喜欢把它放在这里,因为我可以在编写/编辑查询时继续回顾它)。

然后我是否使用 3 个变量、构造函数、空 install() 函数创建一个抽象类并在每个类中实现它?它对我有用吗?

如果这是一个愚蠢的问题,我很抱歉,我之前真的从未在 PHP 中使用过类/继承。

4

2 回答 2

1

然后我是否使用 3 个变量、构造函数、空 install() 函数创建一个抽象类并在每个类中实现它?它对我有用吗?

是的。这 3 个变量protected现在必须是,而不是private,因为它们需要从子类访问。像这样的东西:

abstract class DBTable{
    protected $db;
    protected $prefix;
    protected $tbl_name;

    function __construct($db, $tbl_name) {
            $this->db = $db;
            $this->prefix = $db->tblPrefix();
            $this->tbl_name = $tbl_name;
    }

    abstract function install();
}

class SomeTable extends DBTable {
    private function install() {
        $sql = "CREATE TABLE IF NOT EXISTS...";
        $this->db->query($sql, null);
    }

}
于 2013-08-27T21:41:51.850 回答
1

如果您扩展一个类,您将继承父类中存在的任何公共或受保护方法。因此,如果您有这样的课程:

class Database {

    public function get_database(){
        return 'blah';
    }

}

然后你像这样扩展类:

class Blah extends Database {
    ...
}

现在,Blah 类将继承该方法get_database(),因此两者都Database::get_database()Blah::get_database()返回相同的内容。您还可以使用parent::特殊名称来定位扩展类​​。注意:私有方法仅在实例化它们的类中可用,并且不被继承。

我还应该注意,您可以通过在子类中使用相同的方法名称来覆盖方法。因此,如果您get_database()在 Blah 类中编写方法,它将优先于父类的同名方法。

于 2013-08-27T21:37:58.337 回答