不在对象上下文中时使用$ this

时间:2013-04-09 23:34:57

标签: php

我确定这必须是一个简单的答案,但我只是没有看到它。我正在尝试将所有数据库代码移动到一个类中,以简化我的所有其余代码。

我遇到了这个错误,我不明白为什么

致命错误:当不在第18行的/var/www/php/dbclass.php中的对象上下文中时使用$ this(我用箭头标记了第18行)

这是我的班级

<?php

class kdb {

    var $dbhost = "localhost";
    var $dbname = "name";
    var $dbuser = "root";
    var $dbpass = "pass";

    var $error;

//    function __construct($persons_name) {
//        $this->name = $persons_name;
//    }
    //function to insert safely

    public static function exe($qry_string, $var_array) {
        $host = $this->dbhost;  <------------------ LINE 18
        $name = $this->dbname;
        $user = $this->dbuser;
        $pass = $this->dbpass;
        $retries = 30;
        while ($retries > 0) {
            try {
                $pdo_conn = new PDO("mysql:host={$host};dbname={$name}", $user, $pass);
                $retries = 0;
                //echo 'run query';
            } catch (PDOException $e) {
                $retries--;
                sleep(1); // Wait 1s between retries.
                log::enter_log("Error connecting: {$retries} retries left");
            }
        }
        $q = $pdo_conn->prepare($qry_string);
        $q->execute($var_array);
        $return_arr = $q->fetchAll();
        $this->error = $q->errorInfo();
        //dbconn::logquery($qry_string, $var_array, $q->rowCount(), $error[2]);
        return $return_arr;
    }

}

?>

和页面上的代码

    $db = new kdb();   
    $db_list = $db->exe('select * from table where id = ?', array(42));
    var_dump($db_list);

请注意它只完成了一半,我知道目前它比它需要的更复杂。

2 个答案:

答案 0 :(得分:1)

从该声明中删除static,使其如下所示:

public function exe($qry_string, $var_array) {

如果您处于静态上下文中,则$this伪变量不可用。但是我认为这只是一种疏忽,因为你将方法称为对象方法。

答案 1 :(得分:0)

您可以使用self::从静态方法访问静态变量。 $this只是没有意义,因为它通常指向对象,而在静态函数的情况下,没有对象可以引用。

在您的特定情况下,您的exe函数似乎应该是实例方法而不是静态方法,因此我建议您从方法定义中删除static关键字。

相关问题