【发布时间】:2019-07-14 00:04:30
【问题描述】:
根据我对接口的理解,它们是实现它们的所有类都必须遵守的构造计划。
如果我想创建几个数据库类,比如说一个类来管理 mySQL,另一个类来管理 PostgreSQL,我会创建一个接口,我将在其中放置我的站点工作所需的所有方法,以及我的两个类model.mysqlManager.php 和 model.postgresqlManager.php 将实现此接口。
我不明白的是为什么我们不能在我们的类中重新定义来自接口的方法的可见性。我知道它们是隐式公开的。
就我而言,我希望有这个界面:
interface.iDatabase.php
interface iDatabase {
public function connectDatabase();
// other functions
}
还有这些课程:
model.mysqlManager.php
class mysqlManager implements iDatabase {
protected $db;
const HOST = '127.0.0.1';
const DBNAME = 'dbname';
const CHARSET = 'utf8';
const USERNAME = 'username';
const PASSWORD = 'password';
protected function connectDatabase() {
if(!isset($this->db)) {
try {
$this->db = new PDO('mysql:host='.self::HOST.'; dbname='.self::DBNAME.'; charset='.self::CHARSET.'', self::USERNAME, self::PASSWORD);
} catch(Exception $e) {
die('Erreur : '.$e->getMessage());
}
}
return $this->db;
}
}
model.postgresqlManager.php
<?php
class postgresqlManager implements iDatabase {
protected $db;
const HOST = '127.0.0.1';
const DBNAME = 'dbname';
const CHARSET = 'utf8';
const USERNAME = 'username';
const PASSWORD = 'password';
protected function connectDatabase() {
//function code
}
}
我不想从我的类之外访问这个方法,但我希望所有数据库类都实现它。
我的问题是:
- 接口如何影响实现它的类?它不只是用来定义必须拥有的方法吗?
- 我还可以使用什么其他方式来强制我的类实现此方法?
【问题讨论】:
-
All methods declared in an interface must be public; this is the nature of an interface.- secure.php.net/manual/en/language.oop5.interfaces.php -
使用抽象类。我们称它为 AbstractDatabase 并将方法 connectDatabase 声明为抽象。根据你想要做什么,你可以让你的抽象类实现接口和 postgresqlManager,mysqlManager 都扩展抽象类 AbstractDatabase