抽象和静态方法

时间:2012-12-19 21:23:31

标签: php

我正在创建一个数据库连接类作为超类中的抽象。我在php中使用PDO。我想把它变成抽象的,这样我就可以为mysql,oracle,postgre等声明特定的数据库连接子类。

我在抽象超类中有一个连接方法,我也声明为抽象。我现在的问题是,我可以使这个连接方法在子类中也是静态的吗?我想知道这是否正确。

修改

//SUPER CLASS
abstract protected function connectToDatabase($hostname, $dbName, $userName, $password="");


// SUB CLASS
public static function connectToDatabase($hostname, $dbName, $userName, $password=""){

        $this->setHostName($hostname);
        $this->setDbName($dbName);
        $this->setUserName($userName);
        $this->setPassword($password);
        $this->setDatabaseType(DATABASE_TYPE);
        $dsn = $this->getDatabaseType(DATABASE_TYPE) . ":" . parent::getHostConst() . "=" 
              . $this->getHostName() . ";" . parent::getDbNameConst() . "=" . $this->getDbName();
        $pdo = new PDO($dsn, $username, $passwd);
        $this->setPdoConnection($pdo);
}

2 个答案:

答案 0 :(得分:2)

通过查看你的代码,我会说你不能让它们变得静态,因为你在它们中引用了$ this。 $这对静态方法应该是什么意思? 静态方法只在类中存在一次,而不是引用特殊对象。

例如,请查看:When to use self over $this?

答案 1 :(得分:0)

你在抽象基类中所说的是子类应该实现这个函数签名:

abstract protected function connectToDatabase($hostname, $dbName, $userName, $password="");

您需要子类将connectToDatabase()实现为受保护的方法,然后在子类中将其实现为public。

除非你真的知道自己在做什么,否则不要使用抽象方法忘记基类,只需使用非静态方法创建一个类。保持简单。