PHP:让其他函数访问我的数据库连接函数中的$conn变量
让其他函数访问我的数据库连接函数中的$conn变量 所以在这里,我绝对是不顾一切地试图使一些工作。我知道我想做的不是OOP,也不是100%的最佳实践。这不是一个实时的网站,我只是学习一些基本的PHP概念上的XAMPP 我试图做的是使数据库连接函数中的$conn变量可供所有其他需要它的函数访问。我正在考虑将其作为参数传递,但是如何才能做到这一点呢?我不喜欢使用PHP的“global”或$GLOBALS。我现在的工作方法是使用过程方法与mysqli一起工作 例如,我有这样的东西:PHP:让其他函数访问我的数据库连接函数中的$conn变量,php,Php,让其他函数访问我的数据库连接函数中的$conn变量 所以在这里,我绝对是不顾一切地试图使一些工作。我知道我想做的不是OOP,也不是100%的最佳实践。这不是一个实时的网站,我只是学习一些基本的PHP概念上的XAMPP 我试图做的是使数据库连接函数中的$conn变量可供所有其他需要它的函数访问。我正在考虑将其作为参数传递,但是如何才能做到这一点呢?我不喜欢使用PHP的“global”或$GLOBALS。我现在的工作方法是使用过程方法与mysqli一起工作 例如,我有这样的东西: function
function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}
function someFunction () {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
我从未找到我的问题的答案……我最近熟悉的大多数解决方案都是基于面向对象的,或者使用了一些有点可疑的方法
------------------------------------------------------------------------------------------------------------------------------------
解决方案A-我宁愿避免在包装器中没有连接,也不要使用全局变量:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
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)
}
$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)
}
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");
}
}
解决方案B-我还没有准备好OOP,但我知道这是可行的。关键是我想学习一些不同的东西:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
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)
}
$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)
}
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");
}
}
解决方案C-根本不使用函数…只是将其展开,我觉得从长远来看这并不实用:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
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)
}
$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)
}
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");
}
}
------------------------------------------------------------------------------------------------------------------------------------
我试图实现的解决方案:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
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)
}
$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)
}
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");
}
}
或者类似的东西,我只是将连接作为一个参数或其他东西传入(目前是伪代码)
------------------------------------------------------------------------------------------------------------------------------------
那么,我该如何实现前两个目标,但这两个目标实际上是可行的。这个概念可能吗?将一个参数传递给函数like并返回连接
function db($conn){
$conn = mysqli_connect ("localhost", "root", "", "database");
return $conn;
}
您想要的解决方案:这应该可以,您只需要建立一个连接
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);
}
如果您使用了函数someFunction($conn)
,这将使您的代码更加混乱,因为您实际上无法从任何地方访问$conn
您应该使用解决方案BIMO。这样,您就可以简单地访问数据库::$conn
,这将在整个脚本中保持一致。您可以使用一个initialize
函数(如果需要,可以使用不同的名称)来初始化数据库::$conn
,然后,如果需要,您可以稍后使用该函数初始化数据库
类上的其他内容
解决方案A很糟糕。我做了很长一段时间(global
izing things),这是一个可怕的想法。我不应该那样做。但我做到了。我学会了。它只是让代码变得越来越邋遢
解决方案B:数据库::$conn
应该是公共的
,如果您想通过数据库::$conn
从任何地方访问它。如果它是私有的,那么您将始终需要调用Database::getObject()代码>
解决方案C:你说得对。那是非常不切实际的
解决方案B重写:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
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)
}
$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)
}
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");
}
}
然后。。。在使用前至少调用一次数据库::initialize()
<?php
Database::initialize();
$result = mysqli_query (Database::$conn, "SELECT * FROM examples);
?>
如果您有多个需要db访问的php文件,那么您可以选择使用连接代码创建文件connection.php
<?php
$conn = mysqli_connect ("localhost", "root", "", "database");
?>
并使用包含一次'connection.php'
在所有其他文件中,您都需要连接。简单回答只需将$conn
变量传递到另一个调用函数中(而不是建立新连接)
像
yourpage.php
$conn = new mysqli($servername, $username, $password, $dbname);
someFunction ($conn)//you can add other parameters if you like
function someFunction ($conn) {
$result = mysqli_query ($conn, "SELECT * FROM examples);
}
注意:始终为数据库访问建立新连接不是一个好做法。因此,始终建立一次连接,并在任何地方使用它。(但如果您的要求不同,并且需要多个连接,则可以建立多个连接)本节中的所有答案都是多余的,因为它们只是通过在数据库对象周围创建包装器来增加开销。
对于关注点分离(可维护性),使用单独的PHP文件进行数据库连接,并使用require_一次
//在数据库_Connect.php内部
$db=mysqi_connect(本地主机、数据库、密码)
现在,在mysqli_uu函数中使用$GLOBALS['db'],以满足任何需要
或者,将脚本/对象初始化为
$dbConn=$GLOBALS['db']
并在需要的地方在mysqli_uu函数中使用$dbConn。。。然后从db
函数返回它:返回mysqli\u connect(…)
为什么要传递$conn
然后设置$conn
?我认为你的思路是对的,但正如所写的,示例函数是uselesshow这能回答OP的问题吗?OOP并不是说选择最迟钝的方法。对于您的实际用例,使用最省力、API复杂度最低的方法。为你实际上没有的问题或仅仅为了一些最佳实践模因而过度规划是不可取的。你已经在这里展示了一个解决方案“我正在尝试实现的解决方案:”;为什么这对您不起作用?$Jakar顺便问一下,静态conn做什么?这样值就不会在外部丢失?当我声明static$conn
时,它使得该函数中只存在一个$conn
实例。。。因此,$conn
将引用静态变量(通过多个函数调用保持)而不是局部变量(函数的局部变量)。没有