Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 抽象静态法_Php - Fatal编程技术网

Php 抽象静态法

Php 抽象静态法,php,Php,我正在创建一个数据库连接类作为超类中的抽象。我在php中使用PDO。我想将其抽象化,以便为mysql、oracle、postgre等声明特定的数据库连接子类 我在抽象超类中有一个连接方法,我也将其声明为抽象。我现在的问题是,我能使这个连接方法在子类中也是静态的吗?我想知道这样做是否正确 编辑 //SUPER CLASS abstract protected function connectToDatabase($hostname, $dbName, $userName, $password=""

我正在创建一个数据库连接类作为超类中的抽象。我在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);
}

从你的代码来看,我会说你不能让它们成为静态的,因为你在其中引用了$this。在静态方法中,$这意味着什么? 静态方法在类中只存在一次,并且不引用特殊对象


例如,请看:

您在抽象基类中所说的是,子类应该实现此函数签名:

abstract protected function connectToDatabase($hostname, $dbName, $userName, $password="");
您要求子类将connectToDatabase()实现为受保护的方法,但随后在子类中将其实现为public


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

你的代码现在看起来像什么?@BrendanLong目前我写的不多,但最重要的两个方法都在更新后的帖子中。这一切的意义是什么?PDO已经支持mysql、postgresql和oracle。看起来您只是在硬编码,使其不易维护。抽象定义是实例,而子类定义是静态的-您需要在两者之间进行选择。Marko,还有:您编写这个数据库类是作为一个教育练习吗?如果是的话,很好。如果您打算在生产中使用它,那么可能已经存在适合您需求的数据库包装器,而且它们可能是稳定的,并且经过良好测试。