如何访问课外的对象

时间:2014-02-21 10:19:35

标签: php class object

我正在尝试访问课外的对象。我已经有一个名为Database的类,其中包含一系列函数。

$database = new Database($host,$user,$pass,$name);

class User {

    function view($username) {
        $user = $database->findFirst('User','username',$username);
    }
}

我无法弄清楚如何访问$ database对象并不断收到错误说明Undefined变量。

3 个答案:

答案 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是另一篇文章,您可以通过此解决方案查看相同的情况。