多个 类 如何最好地进行
Multiple classes how best to proceed
我在某些方面有以下工作,我可以在我的脚本中使用 $db->tpl 访问 smarty。
init.php 包含在每个文件的顶部
spl_autoload_register(function ($class) {
include 'inc/classes/' . $class . '.class.php';
});
class Database_Smarty extends Smarty {
function __construct() {
parent::__construct();
$this->setTemplateDir('templates'); // etc etc
}
}
class Filter_Database extends Database {
function __construct() {
parent::__construct();
}
}
class Formatting_Database extends Database {
function __construct() {
parent::__construct();
}
}
class Hashing_Database extends Database {
function __construct() {
parent::__construct();
}
}
Database.class.php
这很好用,我可以从我的数据库对象访问 smarty。当我尝试添加 Formatting_Database 或以下任何扩展到构造中时,我的问题就来了。
class Database {
// vars instantiated
public $tpl;
public $fmt;
public function __construct() {
# Connection here works
$this->tpl = new Database_Smarty;
// Example i cant do this it crashed php leading to no data
// sent notice in the browser.
$this->fmt = new Formatting_Database;
}
}
Formatting.class.php 其余 class 文件遵循相同的格式。
class Formatting {
public $fmt;
public function __construct() {
$this->fmt = new Formatting_Database;
}
任何人都可以指出我需要更改什么才能从 $db 对象访问格式 class。
一个字:递归
可能发生的情况是:
new Database;
[calls __construct on Database]
[calls __construct on Formatting_Database]
[calls __construct on parent (Database)]
[calls __construct on Formatting_Database]
[calls __construct on parent (Database)]
[calls __construct on Formatting_Database]
[calls __construct on parent (Database)]
(for ever and ever and ever)
我不确定为什么 PHP 在这种情况下没有报告堆栈溢出,但这大概是它的方向。
尝试删除此处的行并观察行为:
// Example i cant do this it crashed php leading to no data
// sent notice in the browser.
$this->fmt = new Formatting_Database;
所以我认为你需要重新考虑一下你的设计,精确的解决方案显然取决于具体需要发生什么!
只是最后的额外说明...您可能想看看 require vs include vs include_once vs require_once,除非我的知识已经过时,否则这在包含文件时会有所不同(include_once 不会重新导入第二次)——同样,这取决于所有东西是如何连接在一起的,但值得检查。
我在某些方面有以下工作,我可以在我的脚本中使用 $db->tpl 访问 smarty。
init.php 包含在每个文件的顶部
spl_autoload_register(function ($class) {
include 'inc/classes/' . $class . '.class.php';
});
class Database_Smarty extends Smarty {
function __construct() {
parent::__construct();
$this->setTemplateDir('templates'); // etc etc
}
}
class Filter_Database extends Database {
function __construct() {
parent::__construct();
}
}
class Formatting_Database extends Database {
function __construct() {
parent::__construct();
}
}
class Hashing_Database extends Database {
function __construct() {
parent::__construct();
}
}
Database.class.php 这很好用,我可以从我的数据库对象访问 smarty。当我尝试添加 Formatting_Database 或以下任何扩展到构造中时,我的问题就来了。
class Database {
// vars instantiated
public $tpl;
public $fmt;
public function __construct() {
# Connection here works
$this->tpl = new Database_Smarty;
// Example i cant do this it crashed php leading to no data
// sent notice in the browser.
$this->fmt = new Formatting_Database;
}
}
Formatting.class.php 其余 class 文件遵循相同的格式。
class Formatting {
public $fmt;
public function __construct() {
$this->fmt = new Formatting_Database;
}
任何人都可以指出我需要更改什么才能从 $db 对象访问格式 class。
一个字:递归
可能发生的情况是:
new Database;
[calls __construct on Database]
[calls __construct on Formatting_Database]
[calls __construct on parent (Database)]
[calls __construct on Formatting_Database]
[calls __construct on parent (Database)]
[calls __construct on Formatting_Database]
[calls __construct on parent (Database)]
(for ever and ever and ever)
我不确定为什么 PHP 在这种情况下没有报告堆栈溢出,但这大概是它的方向。
尝试删除此处的行并观察行为:
// Example i cant do this it crashed php leading to no data
// sent notice in the browser.
$this->fmt = new Formatting_Database;
所以我认为你需要重新考虑一下你的设计,精确的解决方案显然取决于具体需要发生什么!
只是最后的额外说明...您可能想看看 require vs include vs include_once vs require_once,除非我的知识已经过时,否则这在包含文件时会有所不同(include_once 不会重新导入第二次)——同样,这取决于所有东西是如何连接在一起的,但值得检查。