我正在处理不同php文件中的几个不同的类。出于某种原因,我第一次调用我的函数时,它可以正常工作,但第二次调用会导致错误。
这是我的“某事”类(为公众视角编辑)
class something{
private $db;
function myfunction($sql){
$db = new db();
$results = $db->select("sql query using $sql");
return(empty($results[0]['name'])?0:1);
}
}
“db”是我用来处理数据库查询等的另一个类。我不相信这个问题存在于此文件中,因为第一次调用正常工作。
这是我用来测试它的代码。这是与“某事”类不同的php文件。
$something = new something();
echo($something->myfunction('string'));
echo($something->myfunction('string2'));
正如我所提到的,第一个调用(“string”)正常工作,但第二个调用(“string2”)失败。这是我得到的错误。
Call to a member function select() on a non-object
我不相信这是select函数(或db类)的问题,因为第一个调用正常工作。我认为问题在于我在“myfunction”中声明$ db,但我不确定原因。
答案 0 :(得分:0)
您使用的是哪种DB包装器?数据库持久性是否已打开?它会断开连接而不是第二次重新连接,从而返回一个空的DB对象。
答案 1 :(得分:0)
我可以假设这是您的代码的简短版本,并且您有一些逻辑只能实例化$db
一次吗?在这种情况下,您必须从
$db = new db();
到
$this->db = new db();
否则db对象将在通话结束时消失。
答案 2 :(得分:0)
首先,每次调用该函数时,我都会回避创建一个新的$ db,除非你在函数调用结束时明确地销毁它。 其次,您正在创建类变量private $ db,但您没有为其分配db对象。 您应该尝试以下方法:
class something{
private $db;
function myfunction($sql){
if(!isset($this->db)){
$this->db = new db();
}
$results = $db->select("sql query using $sql");
return(empty($results[0]['name'])?0:1);
}
}
我觉得这应该会更好。让我知道!
编辑:
正确 - 所以要么按上面的代码显示,要么使用类构造函数来执行此操作。在PHP中,构造函数对象不是类名,它被定义为__construct() 我的方法是扩展DB类,就像我在上面的评论中提到的那样,或者在构造函数中进行扩展。我的理由是因为我不喜欢在方法中创建类实例,如果我可以避免它,我宁愿在创建对象时创建一次。 SOoooooOOOoOOoOOo:
class something{
private $db;
public function __construct(){
$this->db = new db();
}
function myfunction($sql){
$results = $this->db->select("sql query using $sql");
return(empty($results[0]['name'])?0:1);
}
}
请注意$ this->的使用 这是一个PHP的东西。如果你没有熟悉它 - 你将使用它BUNCH。 :) 祝你好运!