在现有对象上“调用非对象上的成员函数”

时间:2013-05-17 18:44:55

标签: php class oop object

我正在处理不同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,但我不确定原因。

3 个答案:

答案 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。 :) 祝你好运!