我需要帮助尝试在另一个类中调用类函数。这是我的设置:
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
答案 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未在主类中定义。