让其他函数访问我的数据库连接函数中的 $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)
}
我从来没有找到我的问题的答案...我最近熟悉的大多数解决方案都是基于 OOP 的或使用了一些有问题的方法。
-------------------------------------------- ---------------------------------------------- --------------------------------------
解决方案 A - 我宁愿避免不在包装器中建立连接并使用全局变量:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
解决方案 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)
}
解决方案 C - 根本不使用函数...只是将其展开,从长远来看我认为这不太实用:
$conn = mysqli_connect ("localhost", "root", "", "database");
$result = mysqli_query ($conn, "SELECT * FROM examples)
-------------------------------------------- ---------------------------------------------- --------------------------------------
我正在努力实现的解决方案:
function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
return $conn;
}
function someFunction () {
$conn = db ();
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
或者像这样的东西,我只是将连接作为参数或其他东西传递(目前是伪代码)
function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}
function someFunction ($conn) {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
-------------------------------------------- ---------------------------------------------- --------------------------------------
那么我如何实现类似最后两个但实际有效的东西。这个概念可能吗?
最佳答案
您想要的解决方案:这应该可行,而且您只会建立一个连接。
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);
}
如果您使用 function someFunction($conn)
,那会使您的代码更加困惑,因为您实际上无法从任何地方普遍访问 $conn
.
您应该选择解决方案 B IMO。这样,您就可以轻松访问它 Database::$conn
,这将在您的整个脚本中保持一致。您可以 应该有一个initialize
函数(如果需要,您可以使用不同的名称)来初始化Database::$conn
,并且您如果需要,可以稍后使用它来初始化 Database
类上的其他内容。
解决方案 A 很糟糕。我这样做了很长时间(global
izing things),这是一个可怕的想法。我不应该那样做。但我做到了。我学会了。它只是让代码变得越来越草率。
解决方案 B: Database::$conn
应该是 public
如果您希望能够通过 Database 访问它: :$conn
来自任何地方。如果它是私有(private)的,那么您总是需要调用 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");
}
}
然后...在使用之前至少调用一次 Database::initialize()
。
<?php
Database::initialize();
$result = mysqli_query (Database::$conn, "SELECT * FROM examples);
?>
编辑
- 您还可以在该 PHP 文件中类声明后立即调用
Database::initialize()
。然后处理初始化。 - 我现在更喜欢
Database::getDb()
之类的东西,而不是直接访问$conn
属性。然后可以从getDb()
函数调用initialize
。基本上类似于 Desired Solution 但在一个类中。上课确实不是必需的,但如果你像我一样喜欢上课,那就太好了。
关于PHP : Make other functions access the $conn variable inside my database connection function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32188985/