PHP5 Class 属性 使用依赖容器重载
PHP5 Class Property Overloading w/ Dependency Container
--------------------更新-------------------- ------------------------------
我没有很好地解释我最终想要通过这种重载完成什么。我基本上只想使用配置对象来存储所有内容,并且只生成一个数据库实例,也在配置中。然后,当我加载页面时,我想 bootstrap 诸如会话数据、用户详细信息、应用程序状态、各种 ID 等之类的东西。只需向配置对象添加一个数组,如:
$userSession['ctime'] = time();
$userSession['key'] = rndkey(32);
etc... etc...
然后使用配置对象,例如...
$_config = new configObject();
$_config->__set('SESSION', $userSession);
etc.. etc...
希望这有助于让我想弄明白的东西更有意义。
--------------------更新结束-------------------- ----------------------
我可以重载依赖容器静态配置 属性 吗?我想调整我的代码以使对象设置动态配置值,但如果它不起作用,我真的不想花所有时间来改变它。我读到一些关于你不能通过引用 __set() 的内容,但不确定它与静态 属性.
有何关系
示例...(这些 classes 显然被精简和简化了)
class depCon {
public static $_database;
public static $_config;
//Database Dependencies
public static function createDatabaseObject() {
$db = new mysqliObject();
$db->setConfig(self::$_config);
$db->connect();
return $db;
}
}
class configObject {
public $overload = array();
public function __construct() {
//set some default values
$this->__set('DBHOST', 'localhost');
$this->__set('DBUSER', 'xxxxxxxxxxx');
$this->__set('DBNAME', 'xxxxxxxxxxx');
$this->__set('DBPASS', 'xxxxxxxxxxx');
}
public function __get($item) {
return array_key_exists($item, $this->overload) ?
$this->overload[$item] : false;
}
public function __set($item, $value) {
$this->overload[$item] = $value;
}
}
class mysqliObject {
public $user = "";
public $pass = "";
public $name = "";
public $host = "";
public $_db;
public $_config;
public function __construct() {
}
public function __destruct() {
$this->close();
}
public function connect() {
$this->host = $this->_config->get('DBHOST');
$this->name = $this->_config->get('DBNAME');
$this->user = $this->_config->get('DBUSER');
$this->pass = $this->_config->get('DBPASS');
$this->MYSQLI_LINK = new mysqli($this->host, $this->user, $this->pass, $this->name);
}
public function setDatabase($databaseConnection) {
$this->_db = $databaseConnection;
}
public function setConfig($config) {
$this->_config = $config;
}
public function close() {
@mysqli_close($this->MYSQLI_LINK);
}
}
用法:
$_config = new configObject();
depCon::$_config = $_config;
$dbi = depCon::createDatabaseObject();
depCon::$_database = $dbi;
所以问题是,如果我这样设置并尝试重载 $_config,例如...
$_config->__set('NEWDYNAMICITEM', 'SomeDynamicData');
和
$_config->__get('NEWDYNAMICITEM');
我会因为依赖容器而通过引用访问 $_config 对象而遇到问题吗?
我是否应该完全取消依赖容器,让数据库 class 扩展配置 class ?
或者反过来?
任何 help/advice 对此将不胜感激,我正在尝试设置自定义 PHP 框架并希望一切正常。
谢谢!
你这样做的方式令人困惑。
最有效的是注射。换句话说,我会完全跳过重载并定义你的数据库 class 在你的其他 class 之外 然后将它们注入你的构造函数。这样您只需定义一次数据库连接并节省开销。
$db = new mysqliObject();
$db->setConfig(depCon::$_config);
$db->connect();
$objct = new exampleObject($db);
--------------------更新-------------------- ------------------------------
我没有很好地解释我最终想要通过这种重载完成什么。我基本上只想使用配置对象来存储所有内容,并且只生成一个数据库实例,也在配置中。然后,当我加载页面时,我想 bootstrap 诸如会话数据、用户详细信息、应用程序状态、各种 ID 等之类的东西。只需向配置对象添加一个数组,如:
$userSession['ctime'] = time();
$userSession['key'] = rndkey(32);
etc... etc...
然后使用配置对象,例如...
$_config = new configObject();
$_config->__set('SESSION', $userSession);
etc.. etc...
希望这有助于让我想弄明白的东西更有意义。
--------------------更新结束-------------------- ----------------------
我可以重载依赖容器静态配置 属性 吗?我想调整我的代码以使对象设置动态配置值,但如果它不起作用,我真的不想花所有时间来改变它。我读到一些关于你不能通过引用 __set() 的内容,但不确定它与静态 属性.
有何关系示例...(这些 classes 显然被精简和简化了)
class depCon {
public static $_database;
public static $_config;
//Database Dependencies
public static function createDatabaseObject() {
$db = new mysqliObject();
$db->setConfig(self::$_config);
$db->connect();
return $db;
}
}
class configObject {
public $overload = array();
public function __construct() {
//set some default values
$this->__set('DBHOST', 'localhost');
$this->__set('DBUSER', 'xxxxxxxxxxx');
$this->__set('DBNAME', 'xxxxxxxxxxx');
$this->__set('DBPASS', 'xxxxxxxxxxx');
}
public function __get($item) {
return array_key_exists($item, $this->overload) ?
$this->overload[$item] : false;
}
public function __set($item, $value) {
$this->overload[$item] = $value;
}
}
class mysqliObject {
public $user = "";
public $pass = "";
public $name = "";
public $host = "";
public $_db;
public $_config;
public function __construct() {
}
public function __destruct() {
$this->close();
}
public function connect() {
$this->host = $this->_config->get('DBHOST');
$this->name = $this->_config->get('DBNAME');
$this->user = $this->_config->get('DBUSER');
$this->pass = $this->_config->get('DBPASS');
$this->MYSQLI_LINK = new mysqli($this->host, $this->user, $this->pass, $this->name);
}
public function setDatabase($databaseConnection) {
$this->_db = $databaseConnection;
}
public function setConfig($config) {
$this->_config = $config;
}
public function close() {
@mysqli_close($this->MYSQLI_LINK);
}
}
用法:
$_config = new configObject();
depCon::$_config = $_config;
$dbi = depCon::createDatabaseObject();
depCon::$_database = $dbi;
所以问题是,如果我这样设置并尝试重载 $_config,例如...
$_config->__set('NEWDYNAMICITEM', 'SomeDynamicData');
和
$_config->__get('NEWDYNAMICITEM');
我会因为依赖容器而通过引用访问 $_config 对象而遇到问题吗?
我是否应该完全取消依赖容器,让数据库 class 扩展配置 class ?
或者反过来?
任何 help/advice 对此将不胜感激,我正在尝试设置自定义 PHP 框架并希望一切正常。
谢谢!
你这样做的方式令人困惑。
最有效的是注射。换句话说,我会完全跳过重载并定义你的数据库 class 在你的其他 class 之外 然后将它们注入你的构造函数。这样您只需定义一次数据库连接并节省开销。
$db = new mysqliObject();
$db->setConfig(depCon::$_config);
$db->connect();
$objct = new exampleObject($db);