PHP类在构造函数中不存在

8 浏览
0 Comments

PHP类在构造函数中不存在

我为标题不清楚向大家道歉,我想不出更好的标题。我遇到了以下错误:\n

\n致命错误:在非对象上调用成员函数query()\n

\n这是由类SPConfig中的构造函数引起的,与类SPClasses一起可以看到如下代码:\n

$sp = new SPClasses();
class SPClasses
{
    public $db, $config, $page, $users;
    function __construct()
    {       
        // SPDatabase类[...]
        $this->db = new SPDatabase();
        // SPConfig类[...]
        $this->config = new SPConfig();
        // [...]
        // SPTemplate类[...]
        $this->page = new SPTemplate();
        // SPUsers类[...]
        $this->users = new SPUsers();
    }
}
class SPConfig
{
    function __construct()
    {
        global $sp;
        $configquery = $sp->db->query("SELECT * FROM config", '检索配置');
        while($row = mysql_fetch_array($configquery))
        {
            try
            {
                $this->{$row['name']} = $row['value'];
            }
            catch (Exception $e)
            {
                $debug_log[] = array(
                    'type' => 'error',
                    'success' => false,
                    'text' => '配置设置' . $row['config_value'] . '的名称无效。'
                );
            }
        }
    }
    public function update()
    {
        $this->__construct();
    }
}

\n有人知道为什么我无法在SPClasses的构造函数中访问$sp->db吗?\n谢谢。

0
0 Comments

PHP类在构造函数中不存在的问题是由于存在一个"鸡生蛋"的问题。在分配全局变量$sp时,你实例化了SPClasses对象,而SPClasses对象又实例化了SPConfig对象,而SPConfig对象又访问了尚未分配的$sp变量。

要解决这个问题,可以将SPClasses对象作为参数传递给SPConfig类即可。这样就能避免在构造函数中访问尚未分配的$sp变量。具体代码如下:

class SPClasses {
    public function __construct() {
        $sp = new SPClasses();
        $config = new SPConfig($sp);
    }
}
class SPConfig {
    public function __construct($sp) {
        // 在这里可以使用$sp对象
    }
}
$sp = new SPClasses();

0
0 Comments

PHP类在构造函数中不存在的原因是因为在构造函数中创建了一个SPConfig实例,而这个实例又试图访问尚未赋值的$sp变量。解决这个问题的方法是构造函数需要将$this或$this->db传递给SPConfig构造函数。

具体来说,直到$sp被构造和赋值之前,它是没有值的。问题在于,构造函数尝试创建一个SPConfig实例,而这个实例试图访问仍然为空的$sp变量。

为了解决这个问题,构造函数将需要将$this或$this->db传递给SPConfig构造函数。

以下是解决方案的代码示例:

class DBConnect {
    private $db;
    public function __construct() {
        $this->db = new DB();
        // Pass $this or $this->db to SPConfig constructor
        $this->sp = new SPConfig($this);
        // or
        $this->sp = new SPConfig($this->db);
    }
}
class SPConfig {
    private $db;
    public function __construct($db) {
        $this->db = $db;
    }
}
class DB {
    // Database connection code here
}

通过将$this或$this->db传递给SPConfig构造函数,可以确保在构造函数中创建SPConfig实例时,可以访问到正确的变量值,从而解决PHP类在构造函数中不存在的问题。

0