让其他函数访问我的数据库连接函数中的$ 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()函数中调用.基本上像所需的解决方案,但在课堂内.这个课真的没有必要,但如果你像我一样喜欢上课,那就太好了.