Php 抽象静态法
我正在创建一个数据库连接类作为超类中的抽象。我在php中使用PDO。我想将其抽象化,以便为mysql、oracle、postgre等声明特定的数据库连接子类 我在抽象超类中有一个连接方法,我也将其声明为抽象。我现在的问题是,我能使这个连接方法在子类中也是静态的吗?我想知道这样做是否正确 编辑Php 抽象静态法,php,Php,我正在创建一个数据库连接类作为超类中的抽象。我在php中使用PDO。我想将其抽象化,以便为mysql、oracle、postgre等声明特定的数据库连接子类 我在抽象超类中有一个连接方法,我也将其声明为抽象。我现在的问题是,我能使这个连接方法在子类中也是静态的吗?我想知道这样做是否正确 编辑 //SUPER CLASS abstract protected function connectToDatabase($hostname, $dbName, $userName, $password=""
//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);
}
从你的代码来看,我会说你不能让它们成为静态的,因为你在其中引用了$this。在静态方法中,$这意味着什么? 静态方法在类中只存在一次,并且不引用特殊对象
例如,请看:您在抽象基类中所说的是,子类应该实现此函数签名:
abstract protected function connectToDatabase($hostname, $dbName, $userName, $password="");
您要求子类将connectToDatabase()实现为受保护的方法,但随后在子类中将其实现为public
除非您真的知道自己在做什么,否则请忘记使用抽象方法的基类,而只使用非静态方法创建单个类。保持简单。你的代码现在看起来像什么?@BrendanLong目前我写的不多,但最重要的两个方法都在更新后的帖子中。这一切的意义是什么?PDO已经支持mysql、postgresql和oracle。看起来您只是在硬编码,使其不易维护。抽象定义是实例,而子类定义是静态的-您需要在两者之间进行选择。Marko,还有:您编写这个数据库类是作为一个教育练习吗?如果是的话,很好。如果您打算在生产中使用它,那么可能已经存在适合您需求的数据库包装器,而且它们可能是稳定的,并且经过良好测试。