在PHP中不使用变量的情况下在类内调用函数
所以我基本上是在现有系统上重新编写一些代码,主要是数据库函数,我把它们放在一个类而不是函数中(目前,mysqli_connect DSN信息是在全局变量中设置的,并且在每次执行查询时都会使用该信息,这就是为什么我尝试清理此信息,但我现在不尝试重新执行整个系统) 当前系统有许多PHP文件,其中包括主dbconnect.PHP文件,该文件具有类似于在PHP中不使用变量的情况下在类内调用函数,php,Php,所以我基本上是在现有系统上重新编写一些代码,主要是数据库函数,我把它们放在一个类而不是函数中(目前,mysqli_connect DSN信息是在全局变量中设置的,并且在每次执行查询时都会使用该信息,这就是为什么我尝试清理此信息,但我现在不尝试重新执行整个系统) 当前系统有许多PHP文件,其中包括主dbconnect.PHP文件,该文件具有类似于function db_query($query,$DSN){}的函数,我们几乎在每个其他文件中都有实际的SQL查询被写出,然后作为db_query($q
function db_query($query,$DSN){}
的函数,我们几乎在每个其他文件中都有实际的SQL查询被写出,然后作为db_query($query);
传递,就是这样
我已经按照下面的代码进行了讨论:
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;
}
}
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);
otherphpfile.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;
}
}
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\u query($query);
我希望这是有意义的,并且任何建议都不会损害使用类的好处(即设置公共静态函数是不值得的)
谢谢重构的一部分是更新代码。老实说,任何IDE都可以轻松地替代
db\u query()
的使用。您可以将db\u查询(
替换为(new db())->db\u查询(
。既然您已经在静态存储连接,我建议将类方法也设置为静态。使用类似于Db::query(…)
将减少冗余且更具可读性。@lawrencerone感谢您的回复。如果我的描述有点混乱,我很抱歉,因为我在办公室一直呆到周五晚上7点,想回家,哈哈。我理解$db=new db();$db->db\u query($query);
是正确的,但我尝试这样做new Db();
而不给它分配变量,因为dbconnect.php
的所有其他函数都是在函数调用之前编写的,例如Db\u query($query)
就像它们现在一样,我不必去更新它们到$db->db\u query($query);
。编写一个脚本来修复代码要比尝试做语言设计不到的事情简单得多。IMHO。你可以做(new db())->db\u query()。但老实说,我认为这是毫无意义的。你正在给你的代码提供新的编写方式,但它仍然可以正常工作。你应该重新思考体系结构,而不是寻找幽灵。我强烈建议你重构代码,去掉所有这些查询函数。它们看起来是一个非常糟糕的主意,可能会阻止你使用预先准备好的语句。C看看最近的这个问题: