我正在使用遍布网络的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()函数放在包含文件中,并将其包含在类定义之外吗?还有其他选择吗?我只是想要它,以便没有任何东西将这个脚本绑定到特定的服务器。我希望将db服务器定义在一个单独的文件中,每个服务器上的文件可能不同。我是PHP的新手,只是想知道专家如何处理这个问题。
**编辑:搞定了!这是所提供答案的混合体。
dbConnect.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();
?>
答案 0 :(得分:2)
您可以使用以下内容:
<强> db.php中:强>
在单独的类中创建连接函数。
the_pandas_serie_object.values()
<强> current_file.php 强>:
class DB {
const DB_SERVER = "myhost";
const DB_USER = "myuser";
const DB_PASSWORD = "mypassword";
const DB_NAME = "mydb";
public $data = "";
private $db = NULL;
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();
}
}
}
答案 1 :(得分:2)
您需要使用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
创建父类或抽象类......
答案 2 :(得分:0)
我建议您定义一个ini配置文件,并在ini文件中配置数据库配置。
使用方法parse_ini_file
从ini文件中获取配置。通过这种方式,您将为每个服务器配置不同的配置。
可以找到有关创建和解析ini文件的文档here