PHP类在构造函数中不存在
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谢谢。
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();
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类在构造函数中不存在的问题。