PHP类抽象/继承

时间:2013-08-27 21:25:15

标签: php mysql oop

可能是一个愚蠢的问题,我在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中使用类/继承。

2 个答案:

答案 0 :(得分:1)

如果扩展类,则将继承父类中存在的任何公共或受保护方法。所以如果你有这样的课程:

class Database {

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

}

然后你像这样扩展这个类:

class Blah extends Database {
    ...
}

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

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

答案 1 :(得分:1)

  

然后我创建一个带有3个变量的构造函数的抽象类,   empty 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);
    }

}