【问题标题】:Call function within class without variable being used in PHP在类中调用函数而不在 PHP 中使用变量
【发布时间】: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


【解决方案1】:

重构的一部分是更新代码。老实说,任何 IDE 都可以轻而易举地替换 db_query() 的使用。您可以将db_query( 替换为(new Db())->db_query(。由于您已经在静态存储连接,我建议将类方法也设为静态。拥有Db::query(...) 之类的内容会减少冗余且更具可读性。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多