ecmall中static变量的使用-model模型代码设计
function &m($model_name, $params = array(), $is_new = false) { static $models = array(); $model_hash = md5($model_name . var_export($params, true)); if ($is_new || !isset($models[$model_hash])) { $model_file = ROOT_PATH . '/includes/models/' . $model_name . '.model.php'; if (!is_file($model_file)) { /* 不存在该文件,则无法获取模型 */ return false; } include_once($model_file); $model_name = ucfirst($model_name) . 'Model'; if ($is_new) { return new $model_name($params, db()); } $models[$model_hash] = new $model_name($params, db()); } print_r($models[$model_hash]); return $models[$model_hash]; } /** * 获取一个业务模型 * * @param string $model_name * @param array $params * @param bool $is_new * @return object */ function &bm($model_name, $params = array(), $is_new = false) { static $models = array(); $model_hash = md5($model_name . var_export($params, true)); if ($is_new || !isset($models[$model_hash])) { $model_file = ROOT_PATH . '/includes/models/' . $model_name . '.model.php'; if (!is_file($model_file)) { /* 不存在该文件,则无法获取模型 */ return false; } include_once($model_file); $model_name = ucfirst($model_name) . 'BModel'; if ($is_new) { return new $model_name($params, db()); } $models[$model_hash] = new $model_name($params, db()); } return $models[$model_hash]; }
使用static变量,当程序退出这段代码的时候,$model并不消失。这样减少了对象建时内存的消耗,有点类似单例模式。
比如这一段代码:
class Model { function __construct() { echo 'construct'.'<br>'; } } function &m($model_name, $params = array(), $is_new = false) { static $models = array(); $model_hash = md5($model_name . var_export($params, true)); if ($is_new || !isset($models[$model_hash])) { $model_name = ucfirst($model_name) . 'Model'; if ($is_new) { return new Model(); } $models[$model_hash] = new Model(); } return $models[$model_hash]; } $s = m('db', array('name')); $s1 = m('db', array('name'));
只执行了一次新建过程。