PHP控制器使用数据库实例的问题

帖子列表 发布于 2013/05/13 17:31
阅读 649
收藏 0
PHP
class Default_Controller extends Controller {
    public function action_pdo()
    {
        //require('PhxPDO.php');
        $db_host = 'localhost';
        $db_name = 'test';
        $db_user = 'root';
        $db_pass = '';

        $db = new PhxPDO( "mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass );
    }
}

怎样让控制器的方法不用new PhxPDO 对象,直接能在方法里使用$db? 把数据库实例注入进Controller的基类的构造函数吗?

一种方法是使用单例,但像那种用的很少的 比如Mailer类,应该怎么传递给控制器的方法?

这是一个新框架正写到一半。

PS:
根据Bl哥的说法

似乎可以
在基类里面定义一个db的成员变量
在controller初始化的时候  把这个成员变量赋值  new  pdo对象
子类继承之后  直接用$this->db

加载中
0
南湖船老大
南湖船老大

面向对象基础是硬伤。。。基础都没弄懂,就要去学框架,写框架。。是一种盲目和好大喜功的表现啊

数据库、视图。。都是应该在基类里做的。给你个我写的例子,我这里只贴了VIEW的处理,数据库是一个道理。基类如下:

class Controll {

    private $db;
    private $view;
    private $model;
    private $control;
    private $action;

    public function __construct() {
        import('View', '.php', 'Core');       
        $this->view=new View();
        
    }

    public function __call($name, $arguments) {
    }
    
    public function _redirect($path,$param=array()){
        
    }
    
    protected function assign($key,$val){        
        $this->view->assign($key, $val);
        return $this;
    }
    
    public  function display($file=""){
        $this->control=get_called_class();
        $this->action=$GLOBALS['ACTION'][0];
        $file=$GLOBALS['_config']['style']. DIRECTORY_SEPARATOR.$this->control. DIRECTORY_SEPARATOR.$this->action;
        $this->view->show($file);
    }

}
子类里直接继承了基类的功能:
class index extends Controll {

    function IndexAction() {
        echo 'Hello HiFramework!';       
        $imgUrl=url('index', 'hi');
        echo "验证码:<img src=\"{$imgUrl}\" />";
        $str='DbMysqli';
        $this->assign('hello', $imgUrl)->assign('two', '-----2222-----');
        $this->assign('three', '---333333333----');
        $this->hi2();
        $this->display();
    }
帖子列表
帖子列表
回复 @阿尔法兽 : 开源不?有地址么?呵呵
南湖船老大
南湖船老大
回复 @李马燕 : 哈哈,我这个不完整,因为我也是上上周才开始写。。名字就叫Hi Framework
帖子列表
帖子列表
写个框架很锻炼基础啊,基础学了一大堆,结果没有实践,看似会了,其实不会。我写框架其实是为了学习。
0
欣儿
欣儿
继承可以
0
leo108
leo108
基类构造函数
帖子列表
帖子列表
回复 @leo108 : 那是多形参咯?
leo108
leo108
回复 @李马燕 : 为什么一定要是数组
帖子列表
帖子列表
如果有很多要传递的实例,也是通过基类构造函数传递成数组形式吗?
0
梅开源
梅开源
用全局变量
帖子列表
帖子列表
这个说是要废弃了吧,似乎都在避免用全局
0
梅开源
梅开源

引用来自“梅开源”的答案

用全局变量
全局变量要废弃?表吓我。全局变量是php吃饭的家伙。。

http://php.net/manual/en/migration54.incompatible.php
The register_globals and register_long_arrays php.ini directives have been removed. 只是把php.ini里对register_globals选项关闭(这个开启会导致post或get来的变量自动有效,从4.3就不提倡了)

http://php.net/manual/en/migration55.incompatible.php
5.5里也没说。


都在避免用全局只是一个假象,或者说是为了实现某些目标而已。现在很多框架都玩命地面向对象,玩命地构造自己的规则(一系列以框架名为前缀的对象与函数+它们之间的高度耦合。 ),用复杂地方式解决复杂的问题,包括把数据库操作本来很简单的事情弄复杂,这需要斟酌这样最终是为了实现什么,并且牺牲了什么


帖子列表
帖子列表
原来应该是register_globals的选项会关闭,我记错了
0
梅开源
梅开源

如果用面向对象的,那么建议做一个成员变量$db,然后用$this->setDbHandle这样。

控制器初始化的时候尽量避免不一定必需的操作,如使用数据库,载入工具大全等,这些会浪费性能。 而且既然要用MVC,尽量设计数据库操作给model吧。

0
南湖船老大
南湖船老大

引用来自“梅开源”的答案

如果用面向对象的,那么建议做一个成员变量$db,然后用$this->setDbHandle这样。

控制器初始化的时候尽量避免不一定必需的操作,如使用数据库,载入工具大全等,这些会浪费性能。 而且既然要用MVC,尽量设计数据库操作给model吧。

可以使用魔术方法 __call 实现延迟加载,仅在调用时才去new 一个对象
0
梅开源
梅开源

引用来自“阿尔法兽”的答案

引用来自“梅开源”的答案

如果用面向对象的,那么建议做一个成员变量$db,然后用$this->setDbHandle这样。

控制器初始化的时候尽量避免不一定必需的操作,如使用数据库,载入工具大全等,这些会浪费性能。 而且既然要用MVC,尽量设计数据库操作给model吧。

可以使用魔术方法 __call 实现延迟加载,仅在调用时才去new 一个对象
受教,好用。
返回顶部
顶部