PHP5类属性重载与依赖容器

时间:2015-03-07 15:44:35

标签: php oop reference dependencies overloading

---------------------- UPDATE ------------------------ ----------------------------

我没有很好地解释我最终要通过这种重载来完成的事情。我基本上只是想使用config对象来存储所有内容,并且只有一个实例产生数据库,也在config中。然后当我加载页面时,我想引导诸如会话数据,用户详细信息,应用程序状态,各种ID等等之类的东西。只需在配置对象中添加一个数组,如:

$userSession['ctime'] = time();
$userSession['key'] = rndkey(32);
etc... etc... 

然后使用配置对象,如...

$_config = new configObject();
$_config->__set('SESSION', $userSession);
etc.. etc...

希望这有助于让我更有意义地了解我想要解决的问题。

---------------------- END UPDATE ----------------------- -------------------

我可以重载依赖项容器静态配置属性吗?我想调整我的代码以使对象设置动态配置值,但如果它无法正常工作,我真的不想花费所有时间来改变它。我通过引用阅读了一些关于你不能__set()的内容,并且不确定它与静态属性的关系。

示例...(这些类显然是剥离和简化的)

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对象?

我是否应该完全取消依赖容器,并让DB类扩展配置类?

或者反过来呢?

我非常感谢您提供的任何帮助/建议,我试图建立一个自定义的PHP框架并希望一切正常。

谢谢!

1 个答案:

答案 0 :(得分:1)

你这样做的方式令人困惑。

最有效的是注射。换句话说,我会完全跳过重载并在你的其他类中定义你的数据库类 ,然后将它们注入你的构造函数中。这样,您只需定义一次数据库连接并节省开销。

$db = new mysqliObject();
$db->setConfig(depCon::$_config);
$db->connect();
$objct = new exampleObject($db);