我正在尝试重构一些代码,但我有点困惑。我这样定义我的数据库连接:
try{
global $conn;
$conn = new PDO("mysql:host=$host",$root,$pw); [...]
现在我想要一个检索表行的函数,但它需要$conn
。有什么方法可以将$conn
传递给这个函数吗?我试图将其设置为默认值,但这不起作用:
function get($table,$conn=$conn,$limit=10){ [...]
然后我尝试了use
关键字,但我认为它仅适用于匿名函数:
function get($table,$limit=10)use($conn){
$query = $conn->query(" [...]
其他人如何做到这一点?我错过了一些明显的东西吗?
答案 0 :(得分:4)
function get($table, $limit=10)
正如您在问题中所写,此函数标题不完整。如果没有$conn
,函数本身就无法完成它需要做的事情。
由于这是全局命名空间中的一个函数,最直接的事情可能是使用全局变量:
function conn_get($table, $limit=10) {
global $conn;
我还将函数命名为间隔,以使关系清晰。这个问题有两个:
所以你通常在这种情况下做的就是把它包装成一个类:
class Conn
{
private $conn;
public function __construct(PDO $conn) {
$this->conn = $conn;
}
public function get($table, $limit=10) {
$query = $this->conn->query("[...]");
...
}
}
然后传递可以使用的Conn
对象:
$pdo = new PDO("mysql:host=$host", $root, $pw);
$conn = new Conn($pdo);
然后:
$conn->get('ColorTable', 200);
私有变量接管全局变量的角色,其好处是同一对象内的每个方法都可以访问它。所以现在一切都在它自己的空间而且与全球空间相反,不会快速地进入彼此的方式。随着时间的推移,这很容易(更容易)改变和维护。
答案 1 :(得分:0)
当您调用该函数时,即:
$table_rows = get($table, $conn);
您正在函数范围内传递局部变量。
但是,您无法将非静态变量定义为默认值:$conn=$conn
将引发致命错误。
答案 2 :(得分:0)
您可以做的最简单的事情是创建一个能够返回$conn
变量的函数
function conn (){
$conn = NULL;
...some database connection setup etc...
return $conn;
}
并将其调用到您需要使用它的其他功能
function getDb(){
conn()->query(" [...]");
}
PHP脚本上的所有函数都可以使用conn()
函数。
但是如果您计划制作更复杂的Web应用程序,我建议您使用PHP框架或创建PHP类并应用OOP原则来为您处理数据库连接。
答案 3 :(得分:0)
在PHP中,use
是匿名/ lambda函数的方法,但不适用于普通函数。
如果数据库连接在全局范围内飞来飞去,您可以将它作为普通变量传递给您的函数,如下所示:
function get(PDO $conn, $table,$limit=10) {
$query = $conn->query(" [...]
}
除此之外(糟糕的做法!)是将全局$conn
变量放入函数中,如下所示:
function get($table,$limit=10) {
$query = $GLOBALS['conn']->query(" [...]
}
但是,建议采用面向对象的方法!您可能希望inject the Database Class via dependency injection进入您需要的类中。