【发布时间】:2019-11-10 20:41:30
【问题描述】:
所以我基本上是在现有系统上重新做一些代码,主要是数据库函数,我把它们放在一个类而不是一个函数中(目前 mysqli_connect DSN 信息设置在全局变量中,并且正在使用每一个完成查询的时间,这就是为什么我试图清理它,但我现在不想重新做整个系统。
当前系统有许多 PHP 文件,其中包括主 dbconnect.php 文件,其函数类似于 function db_query($query,$DSN){},我们在几乎每个其他文件中都有实际的 SQL 查询被写出,然后作为 @987654323 传递@ 就是这样。
我已经按照以下代码的行移到了一些东西:
dbconnect.php
class Db {
protected static $connection;
function __construct() {
if (! isset($GLOBALS['DEBUG'])) { $GLOBALS['DEBUG'] = 0; }
}
public function connect() {
if(!isset(self::$connection)) {
self::$connection = new mysqli($GLOBALS['DSN']);
}
if(self::$connection === false) {
return false;
}
unset($GLOBALS['DSN']); //unset so that login info is not roaming around anymore now that the connection has been established
return self::$connection;
}
public function db_query($query) {
$connection = $this->connect();
$result = $connection->query($query);
return $result;
}
}
otherphpfile.php
include_once 'dbconnect.php';
(new Db()); //I have also tried new Db();
$query = "SELECT * FROM table;";
db_query($query); //I have to try to do it like this since 99.9% of the system is already using this method and I don't want to have to go through all the code and update it with something like:
$db = new Db();
$db->db_query($query);
我知道$db = new Db(); $db->db_query($query); 是正确的,但我试图这样做new Db(); 没有分配变量,因为dbconnect.php 的所有其他函数都是在函数调用前面没有变量的情况下编写的比如db_query($query);,就像他们现在一样,我不必去更新他们所有的$db->db_query($query);。
我希望这是有道理的,任何建议都会很好,而不会损害从使用类开始的好处(AKA 设置公共静态函数是不值得的)
谢谢
【问题讨论】:
-
@LawrenceCherone 感谢您的回复。很抱歉,如果我在描述中感到困惑,我在办公室直到周五晚上 7 点才想结束工作,然后想回家,哈哈。我知道
$db = new Db(); $db->db_query($query);是正确的,但我试图这样做new Db();没有分配变量,因为dbconnect.php的所有其他函数都是在函数调用前面没有变量的情况下编写的,例如@ 987654336@ 就像他们现在一样,无需我去更新所有这些到$db->db_query($query);。 -
编写脚本来修复代码比尝试做一些语言不适合做的事情要简单。恕我直言。
-
你可以做 (new Db())->db_query()。但老实说,我认为这是没有意义的。您正在为代码提供新的编写方式,但它仍然可以正常工作。你应该重新思考架构,而不是追捕幽灵。
-
我强烈建议重构您的代码并摆脱所有这些查询功能。它们看起来是一个非常糟糕的主意,它们可能会阻止您使用准备好的语句。看看这个最近的问题:When to use prepared statements?
标签: php