-1

我正在处理不同的 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,但我不确定为什么。

4

3 回答 3

0

您使用的是哪种数据库包装器?数据库持久化是否开启?它可能会在第二次断开连接而不重新连接,从而返回一个空的 DB 对象。

于 2013-05-17T18:50:22.213 回答
0

我可以假设这是您的代码的简短版本,并且您有一些逻辑可以$db只实例化一次吗?在这种情况下,您必须将该行从

$db = new db();

$this->db = new db();

否则 db 对象将在调用结束时消失。

于 2013-05-17T18:53:07.880 回答
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 类,或者在构造函数中进行。我的理由是,如果可以避免的话,我只是不喜欢在方法内部创建类实例,我宁愿在创建对象时创建一次。呜呜呜呜呜呜:

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 的事情。如果您不熟悉它,请熟悉它——您将大量使用它。:) 祝你好运!

于 2013-05-17T18:54:41.840 回答