PHP:让其他函数访问我的数据库连接函数中的$ conn变量

Asp*_*ger 12 php

让其他函数访问我的数据库连接函数中的$ conn变量

所以在这里,我绝望地试图让事情发挥作用.我知道我试图做的不是OOP也不是100%最佳实践.它不适用于实时网站,我只是在XAMPP上学习一些基本的PHP概念.

我想要做的是使我的数据库连接函数中的$ conn变量可供所有其他需要它的函数访问.我想把它作为参数传递,但是怎么做呢?我不喜欢使用PHP的"全局"或$ GLOBALS.我现在的工作方法是使用mysqli使用程序方法.

例如,我有这样的事情:

function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}

function someFunction () {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
Run Code Online (Sandbox Code Playgroud)

我从来没有找到我的问题的答案...我最近熟悉的大多数解决方案都是基于OOP或使用有些可疑的方法.

-------------------------------------------------- -------------------------------------------------- --------------------------------

解决方案A - 我宁愿避免在包装器中使用全局变量并且不使用全局变量:

global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;

function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
Run Code Online (Sandbox Code Playgroud)

解决方案B - 我还没有为OOP做好准备,但我知道这有效.关键是我想学习不同的东西:

class Database
{
    private static $conn;

    public static function getObject()
    {
        if (!self::$conn)
            self::$conn = new mysqli("localhost", "root", "", "database");

        return self::$conn;
    }
}

function someFunction () {
$result = mysqli_query (Database::$conn, "SELECT * FROM examples)
}
Run Code Online (Sandbox Code Playgroud)

解决方案C - 根本不使用功能......只是保持打开状态,从长远来看,我觉得这样做不太实用:

$conn = mysqli_connect ("localhost", "root", "", "database");

$result = mysqli_query ($conn, "SELECT * FROM examples)
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- -------------------------------------------------- --------------------------------

我想要实现的解决方案:

function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
return $conn;
}

function someFunction () {
$conn = db ();
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
Run Code Online (Sandbox Code Playgroud)

或者类似这样的地方,我只是作为参数或其他东西传递连接(目前是伪代码)

function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}

function someFunction ($conn) {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- -------------------------------------------------- --------------------------------

那么我如何实现类似最后两个但实际上有效的东西.这个概念可能吗?

Ree*_*eed 14

您需要的解决方案:这应该可行,您只需建立一个连接.

function db () {
    static $conn;
    if ($conn===NULL){ 
        $conn = mysqli_connect ("localhost", "root", "", "database");
    }
    return $conn;
}

function someFunction () {
    $conn = db();
    $result = mysqli_query ($conn, "SELECT * FROM examples);
}
Run Code Online (Sandbox Code Playgroud)

如果您使用了function someFunction($conn),那将使您的代码变得更加混乱,因为您实际上无法$conn从任何地方进行通用访问.

你应该选择解决方案B IMO.这样,您就可以轻松访问它Database::$conn,这将在整个脚本中保持一致.您可能应该有一个initialize函数(您可以使用不同的名称,如果您需要),它将初始化Database::$conn,然后您可以根据需要使用它来Database稍后初始化类中的其他内容.

解决方案A很糟糕.我这样做了很长时间(global蠢事),这是一个可怕的想法.我应该从未这样做过.但我做到了.我学到了.它只是让代码逐渐变得更加邋and和邋..

解决方案B: Database::$conn应该是public您希望能够Database::$conn从任何地方访问它.如果它是私人的,那么你总是需要打电话Database::getObject();

解决方案C:你是对的.那将是非常不切实际的.

解决方案B重写:

class Database
{
    /** TRUE if static variables have been initialized. FALSE otherwise
    */
    private static $init = FALSE;
    /** The mysqli connection object
    */
    public static $conn;
    /** initializes the static class variables. Only runs initialization once.
    * does not return anything.
    */
    public static function initialize()
    {
        if (self::$init===TRUE)return;
        self::$init = TRUE;
        self::$conn = new mysqli("localhost", "root", "", "database");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后...... Database::initialize()在使用之前至少调用一次.

<?php
Database::initialize();
$result = mysqli_query (Database::$conn, "SELECT * FROM examples);
?>
Run Code Online (Sandbox Code Playgroud)

编辑

  • 您也可以Database::initialize()在声明该类的PHP文件后立即调用.然后处理初始化.
  • 我现在更喜欢直接Database::getDb()访问$conn酒店的东西.然后initialize可以从getDb()函数中调用.基本上像所需的解决方案,但在课堂内.这个课真的没有必要,但如果你像我一样喜欢上课,那就太好了.