php oop在类中调用一个类

时间:2011-09-24 09:21:02

标签: php

我需要帮助尝试在另一个类中调用类函数。这是我的设置:

db.php中

class db
{
function connect(){
//db connection code here
}
function query($sql){
//perform query and return results
}
}//end db class

main.php

class main
{
function test(){
$sql = "select * from user";
$result = $db->query($sql);//does not work
}
}//end class

的index.php

require_once './db.php';
$db=new database;
$db->connect();
//so far so good
require_once './main.php';
$main=new main;
//rest of the code here

问题是在index.php上我可以运行$ db-> query($ sql)而没有任何问题,但我似乎无法在主类中运行它们,更具体地说是在测试函数内部运行它们。因此,如果我从index.php调用$ main-> test(),我会收到此错误:

Fatal error: Call to a member function query() on a non-object in /path/to/file

4 个答案:

答案 0 :(得分:3)

与PHP中的全局变量不同,不在函数/方法的可见范围内,请参阅http://docs.php.net/language.variables.scope
要访问全局变量,您必须通过global $var将它们导入到函数的范围中,或者通过superglobal $_GLOBAL

来访问它们。

但是,您可能对dependency injection感兴趣,而不是使用全局变量。 (实现di的许多可能方式之一):

<?php
$db = new db;
$db->connect();
$main = new main($db);
$result = $main->test();

class db
{
    function connect(){
        //db connection code here
    }
    function query($sql){
        //perform query and return results
    }
}


class main
{
    protected $db;
    public function __construct($db) {
        $this->db = $db;
    }

    public function test(){
        $sql = "select * from user";
        return $this->db->query($sql);
    }
}

答案 1 :(得分:1)

我会在getInstance()类中添加静态Db方法。然后,cou可以从每个范围调用Db::getInstance()->query(...)。您可以在Wikipedia上了解有关此模式的更多信息。

答案 2 :(得分:0)

刚刚提出:

全球$ db;

在你的test()函数中。

但是如果你这样做也要确保你检查$ db是否存在,并且在你以这种方式使用之前就是你的想法。

答案 3 :(得分:0)

我猜你应该使用

$db = new db;

因为$ db未在主类中定义。

相关问题