我使用的是遍布整个网络的 PHP REST API 示例。基本上是这样的:
<?php
require_once("Rest.inc.php");
class API extends REST {
const DB_SERVER = "myhost";
const DB_USER = "myuser";
const DB_PASSWORD = "mypassword";
const DB_NAME = "mydb";
public $data = "";
private $db = NULL;
public function __construct(){
parent::__construct();
$this->dbConnect();
}
private function dbConnect(){
try {
$this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
public function processApi(){
$func = strtolower(trim(str_replace("/","",$_REQUEST['rquest'])));
if((int)method_exists($this,$func) > 0) {
$this->$func();
} else {
$this->response('',404);
}
}
private function activity(){
...
}
private function client(){
...
}
private function facility(){
...
}
etc...
private function json($data){
if(is_array($data)){
return json_encode($data);
}
}
}
// Initiiate Library
$api = new API;
$api->processApi();
?>
它工作正常,只是我不想在该脚本中硬编码数据库连接参数。将它们与该脚本分开的最佳方法(或有什么方法)是什么?我不能在类声明中使用包含文件。我可以将整个 dbConnect() 函数放在一个包含文件中,并将其包含在类定义之外吗?还有其他选择吗?我只是想要它,以便没有任何东西将此脚本绑定(bind)到特定服务器。我更愿意将数据库服务器定义在一个单独的文件中,该文件在每个服务器上可能不同。我是 PHP 的新手,只是想知道专家们是如何处理这个问题的。
**编辑:开始工作了!这是所提供答案的混合体。
数据库连接.php
<?php
class DB {
const DB_SERVER = "myserver";
const DB_USER = "myuser";
const DB_PASSWORD = "mypassword";
const DB_NAME = "mydb";
private $db = null;
public function __construct() {
try {
$this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
}
?>
API.php
<?php
require_once("Rest.inc.php");
require_once("dbConnect.php");
class API extends REST {
public $data = "";
private $db = null;
public function __construct(DB $mydb){
parent::__construct();
$this->db = mydb->db;
}
}
// Initiiate Library
$api = new API(new DB());
$api->processApi();
?>
最佳答案
您需要使用Dependency Injection
模式,它会对您有所帮助。你会得到这样的东西:
interface DB
{
// Here you need to declare your common methods for all DB classes.
}
class MasterDB implements DB
{
const DB_SERVER = "myhost";
const DB_USER = "myuser";
const DB_PASSWORD = "mypassword";
const DB_NAME = "mydb";
private $db = null;
private function __construct()
{
try {
$this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
}
class SlaveDB implements DB
{
// Here you need to provide another connection
}
class API extends REST
{
private $db = null;
public function __construct(DB $db)
{
parent::__construct();
$this->db = $db;
}
}
$api = new API(new MasterDB());
// or
$api = new API(new SlaveDB());
$api->processApi();
这不是一个完美的例子,但这个例子会帮助你解决你的问题!下一步可能是 - 为 MasterDB
和 SlaveDB
创建父类或抽象类...
关于php - 对于 PHP REST API,如何在类定义之外定义/设置数据库连接参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403898/