我正在尝试访问课外的对象。我已经有一个名为Database的类,其中包含一系列函数。
$database = new Database($host,$user,$pass,$name);
class User {
function view($username) {
$user = $database->findFirst('User','username',$username);
}
}
我无法弄清楚如何访问$ database对象并不断收到错误说明Undefined变量。
答案 0 :(得分:1)
$database
应该是班级成员。试试这个:
$database = new Database($host,$user,$pass,$name);
class User {
protected $db;
public function __construct($database) {
$this->db = $database;
}
public function view($username) {
$user = $db->findFirst('User','username',$username);
}
}
答案 1 :(得分:1)
你可以使用依赖注入 - 构造函数注入,例如
class User
{
/**
* @var Database
*/
protected $db;
public function __construct(Database $database)
{
$this->db = $database;
}
public function view($username)
{
$user = $this->db->findFirst('User', 'username', $username);
}
}
$database = new Database(/* ... */);
$user = new User($database);
关于评论中的问题:是的,这是可能的。让我们考虑一些基本的(抽象)类,它们可以用作所有应该共享相同基本逻辑的类的父类(例如,连接到数据库,或者至少注入数据库连接)。
这样的抽象类可以是:
class DBObject
{
/**
* @var Database
*/
protected $db;
public function __construct(Database $db)
{
$this->db = $db;
}
}
然后我们的User
类可以用这种方式扩展这个抽象类:
class User extends DBObject
{
public function view($username)
{
$user = $this->db->findFirst('User', 'username', $username);
}
}
请记住,尽管抽象类可以实现__construct()
函数,但它无法直接实例化。然后代码中的某处你可以像第一个例子那样做:
$database = new Database(/* ... */);
$user = new User($database);
$post = new Post($database);
答案 2 :(得分:0)
只需在函数中将其定义为全局变量即可。然而,正确的方法是使用数据库类构建构造函数或扩展。
$database = new Database($host,$user,$pass,$name);
class User {
function view($username) {
global $database;
$user = $database->findFirst('User','username',$username);
}
}
P.S。 Here是另一篇文章,您可以通过此解决方案查看相同的情况。