Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中不使用变量的情况下在类内调用函数_Php - Fatal编程技术网

在PHP中不使用变量的情况下在类内调用函数

在PHP中不使用变量的情况下在类内调用函数,php,Php,所以我基本上是在现有系统上重新编写一些代码,主要是数据库函数,我把它们放在一个类而不是函数中(目前,mysqli_connect DSN信息是在全局变量中设置的,并且在每次执行查询时都会使用该信息,这就是为什么我尝试清理此信息,但我现在不尝试重新执行整个系统) 当前系统有许多PHP文件,其中包括主dbconnect.PHP文件,该文件具有类似于function db_query($query,$DSN){}的函数,我们几乎在每个其他文件中都有实际的SQL查询被写出,然后作为db_query($q

所以我基本上是在现有系统上重新编写一些代码,主要是数据库函数,我把它们放在一个类而不是函数中(目前,mysqli_connect DSN信息是在全局变量中设置的,并且在每次执行查询时都会使用该信息,这就是为什么我尝试清理此信息,但我现在不尝试重新执行整个系统)

当前系统有许多PHP文件,其中包括主dbconnect.PHP文件,该文件具有类似于
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看看最近的这个问题: