我正在尝试使用数据库类(ADOdb for PHP),但我不知道如何在另一个类中使用它。 例如:
<?php
include_once("adodb.inc.php");
$conn = NewADOConnection('mysql');
class Contacts {
public function getData(){
$conn->Connect(...);
//do something
}
}
?>
我认为问题在于我无法调用$ conn,因为它在类外定义。
注意:未定义的变量:conn
致命错误:在非对象上调用成员函数Connect()
也许我做错了,但我真的不知道如何解决这个问题。
有人可以帮帮我吗?非常感谢!
答案 0 :(得分:4)
您有多种选择:
使用全球储备字:
<?php
include_once("adodb.inc.php");
$conn = NewADOConnection('mysql');
class Contacts {
public function getData(){
global $conn;
$conn->Connect(...);
//do something
}
}
?>
或者在创作时将$ conn传递给你的对象
$contacts = new Contacts($conn);
class Contacts {
protected $conn;
public function __construct($conn){
$this->conn = $conn;
}
public function getData(){
$this->conn->Connect(...);
//do something
}
}
?>
或者您可以使用Singleton数据连接对象。但这被认为是一种反模式,所以我会像选项2那样注入你的依赖。
答案 1 :(得分:4)
为什么不简单地这样做?!
<?php
include_once("adodb.inc.php");
$conn = NewADOConnection('mysql');
$conn->Connect(...);
class Contacts {
protected $_connection;
public function __construct($conn)
{
$this->_connection = $conn;
}
public function getData(){
//do something
}
}
$contacts = new Contacts($conn);
$foobar = new FooBar($conn);
?>
在类之外建立连接,然后传入已经可用的对象是有意义的。当然,在所有需要它的类中共享相同的连接对象。
P.S我真的非常建议放弃ADODB并开始学习PDO。
答案 2 :(得分:2)
您需要引用全局变量:
<?php
include_once("adodb.inc.php");
$conn = NewADOConnection('mysql');
class Contacts {
public function getData(){
global $conn;
$conn->Connect(...);
//do something
}
}
?>
那就是说,你可能会更好地使用依赖注入:
<?php
class Contacts {
private $db;
public function setDB($conn) {
$this->db = $conn;
}
public function getData(){
if (!$this->db) {
throw new Exception();
}
$conn = $this->db;
$conn->Connect(...);
//do something
}
}
?>
然后在初始化部分中包含您的adodb include和instantiation。
编辑:请参阅Dependency Injection上的这篇文章,因为养成使用它(而不是全局变量)的习惯可能会在未来节省很多麻烦。
答案 3 :(得分:1)
$conn
超出了您的变量范围。使用以下命令使其工作:
class Contacts {
public function getData(){
global $conn;
$conn->Connect(...);
//do something
}
}
另一种方法是在对象中引用变量:
class Contacts {
private $ref;
public function __construct($conn)
{
$this->ref = $conn;
}
public function getData(){
$ref->Connect(...);
//do something
}
}
$contacts = new Contacts($conn);