嗯?
1.任何封装对性能肯定只有坏处没有好处,不过开发舒服多了。
2.不是static的错请另找错语。
3.蹦过
4.BaseClass生命周期是unset或页面退出为止。
5.有价值

解决方案 »

  1.   

    M层的确会更浪费资源。所有的好处都是在开发上的,性能下降是必然。即便是java里的M一样会对性能造成影响,只不过没有php里明显罢了。
      

  2.   

    1 把访问Mysql的相关函数封装成类,当然是有好处的,这个可以使你的开发简单
      代码重用,相关的错误处理也好弄
    2 这儿的static $instance;是来保证当前用户可以不用多建立很多这个类的实例
    4 unset或者页面执行完毕
    5 Java了解不多,不过我认为MVC还是有它的好处的,这样开发的程序结果清楚,
      方便扩展。
      

  3.   

    楼上的,我对2还是有些模糊,能否方便留个mail,我把这几个文件的源代码发给你,很简单的,你协助看一下。我认为你的回答2和4是有矛盾的,如果如4的回答,那么在2中的现象就正常了,因为BaseClass都消亡了,那么在FacClass中的$instance的指向也就成了个问题。
      

  4.   

    我上面的回答是针对Gdj(陈水.智商只有129.非卖品) 哥们的答复,呵呵,别搞混了
      

  5.   

    我认为你的回答2和4是有矛盾的,如果如4的回答,那么在2中的现象就正常了,因为BaseClass都消亡了,那么在FacClass中的$instance的指向也就成了个问题。
    ------------------------------One user may have sevaral instances.
      

  6.   

    1 封装的结果在任何语言都是一样,降低效率,换来的是程序层次的结构化,封装的类多了,就成了你自己的模板,框架了。2,引用并不是静态地存储的,当第二次遇到if (!isset($instance))判断时,$instance还是处于未赋值状态!"在一个函数域内部用static语句导入的一个static实际上是建立了一个到static的引用",这是php手册的原话。你可以在static $instance;这句下面加入
    echo '$instance: ';
    var_dump($instance);
    来看一下,无论你调用多少次这个函数,$instance都为:NULL.
    如果这个函数的原型为function getDatabaseConnection()而不是function &getDatabaseConnection()的话,第二次调用的时候,$instance就不为空了。
    问题是来自于引用,而不是来自static。所以,static在php和java里面的工作方式应该都是一样的。4,显示的释放unset($obj);或者碰到本页面的"?>"标记。你可以在类里面写个析构函数__destruct(),然后测试一下就知道了。5,MVC模式只能说你想不想用,而不是能不能用。说实话我在做PHP开发的时候不喜欢MVC,可能是因为习惯问题吧。不过MVC的好处我们都是知道的。
      

  7.   

    我认为你的回答2和4是有矛盾的,如果如4的回答,那么在2中的现象就正常了,因为BaseClass都消亡了,那么在FacClass中的$instance的指向也就成了个问题。
    ------------------------------One user may have sevaral instances.
    ==================================================
    我觉得还是解释不通的
      

  8.   

    ShadowSniper(青春不等人呀...) :
    多谢你的回答,我还有两个问题请教一下,
    1、如果如你所言,“如果这个函数的原型为function getDatabaseConnection()而不是function &getDatabaseConnection()的话,第二次调用的时候,$instance就不为空了”,那么是不是意味着,如果改成function getDatabaseConnection(),那么一个客户在访问期间只需要连接一次数据库就可以了,其他任何时候,都会直接使用这个$instance了。如果是这样,那么为什么xoops采用的是引用方式,而不是你所说那种方式呢?2、想知道你在使用php开发过程中,不采用mvc,一般会采用什么模式呢,我觉得直接用两层可能会比较理想,也就是一个显示层,一个数据操作层,显示层直接调用数据操作层就行了,这样相当于在mvc和普通的页面直接访问数据库两种方式间进行了个折衷,不知道你有何高见?3、(多问一个)你最近有无换工作的打算,如果是北京的,我有个机会推荐给您,公司实力没得说,关键是您的php水平要高,呵呵!
      

  9.   

    我再补充一个问题:
        xoops采用这种模式倒可以理解,我不太理解的是,他为什么非要这样定义一个$instance呢,大家认为他这样作到底出于什么目的呢?
      

  10.   

    <?
    import("Kit.DB.DBRecordset");

    class DBConnection
    {
    //@#$------------------------------------------------------
            //| class instance,singleton pattern
            //@#$------------------------------------------------------
    private static $instance;

    //@#$------------------------------------------------------
            //| database link resource
            //@#$------------------------------------------------------
    private $dbLink;

    //@#$------------------------------------------------------
            //| connect to database,all paramter are defined in 
            //| application's Config.php file
            //@#$------------------------------------------------------
    private function __construct()
    {
    try
    {
    $this->dbLink=
    @mysql_connect(DB_SERVER,DB_USERID,DB_PASSWORD)
    or throwException("Connect to database failed!");
    $error="Database error : Unknown database name";
    @mysql_select_db(DB_CATALOG,$this->dbLink) 
    or throwException($error);
    }
    catch(Exception $e)
    {
    throwException($e);
    }
    }

    //@#$------------------------------------------------------
            //| using singleton pattern for create database connection
            //@#$------------------------------------------------------
    public function singleton()
    {
    if(isset(self::$instance))
    {
    return self::$instance;
    }
    $class=__CLASS__;

    return new $class;
    }

    //@#$------------------------------------------------------
            //| execute sql with DBResultset object return
            //@#$------------------------------------------------------
    public function query($query)
    {
             $result = @mysql_query($query, $this->dbLink);
             if($result==false)
             {
             throwException("SQL:$query,".mysql_error());
             return null;
             }
             return new DBRecordset($result);
            }
            
            //@#$------------------------------------------------------
            //| execute sql(INSERT,UPDATE,DELETE)
            //@#$------------------------------------------------------
            private function execute($query)
            {
             $result = @mysql_query($query, $this->dbLink);
             if($result==false)
             {
             throwException("SQL:$query,".mysql_error());
             return 0;
             }
            }
            
            //@#$------------------------------------------------------
            //| update record
            //@#$------------------------------------------------------
            public function update($query)
            {
             $this->execute($query);
    return mysql_affected_rows();
            }
            
            //@#$------------------------------------------------------
            //| create a new record of a table and return the insert id
            //| if error occured will throw a database exception
            //@#$------------------------------------------------------
    public function insert($query)
    {
    $this->execute($query);
    return mysql_insert_id();
    }

    //@#$------------------------------------------------------
            //| delete record,simple call update()
            //@#$------------------------------------------------------
    public function delete($query)
    {
    return $this->update($query);
    }

    //@#$------------------------------------------------------
            //| get first row's first field value
            //@#$------------------------------------------------------
    public function getOne($query)
    {
    $result = @mysql_query($query, $this->dbLink);
             if($result==false)
             {
             throwException("SQL:$query,".mysql_error());
             return null;
             }
             $row=mysql_fetch_row($result);
             mysql_free_result($result);
             return $row[0];
    }

    //@#$------------------------------------------------------
            //| get first row
            //@#$------------------------------------------------------
    public function getRow($query)
    {
    $result = @mysql_query($query, $this->dbLink);
             if($result==false)
             {
             throwException("SQL:$query,".mysql_error());
             return null;
             }
             $row=mysql_fetch_assoc($result);
             mysql_free_result($result);
             if($row)
             return new DBRecord($row);
             else
             return null;
    }
    }
    ?>
      

  11.   

    关于2,在跨页面时,static 变量是不能保持的,因为如上所说,到页面结束, 所有变量生命期就结束了.
    但是在同一个页面里,有多个该类的实例时,可以通过static来共享这个 $instance .
      

  12.   

    关于4, 在php里所有的变量\类\资源都是到页面结束就完蛋的.要跨页面共享数据,只能通过session/cookie/等, (当然文件/数据库等也可以).       这点和java不同.
      

  13.   

    1、这种实现方式与直接在页面中写数据连接,不考虑代码分离的因素,还有什么其他性能上的好处吗?
    这样做可以方便代码的重用和移植,也便于减少更改数据库时的修改量2、在FacClass中定义的static $instance;和java中的static的工作方式好像不一样阿,我试验过程中,还作了分页,发现在翻页过程中,每次在页面上都会打印出"Need Connect"(在FacClass.php文件中),那么定义这个static还有何意义呢?
    没有意义!
    这个static只是在于:如果数据库已经连接就不再连接,而php本身就提供了这个功能3、在此方式的基础上,我有无可能在BaseClass中,定义一个全局的(类似于Application)的连接对象,然后所有的数据处理都用这个连接对象呢。如果可行,那么也似乎就不必考虑mysql_connect和mysql_pconnect了。
    不可以4、在这种方式下,我想知道FacClass中new的BaseClass的生命周期是什么,是show.php页面全部执行完后就结束了吗?
    当FacClass的实例注销时
    任何变量都只生存在当前执行的程序中5、扩展问题,php中进行MVC模式的设计有没有真正的价值,发现现在的讨论没有什么定论,有的说有价值,有的说根本无法达到java中类似struts的方式,相反在M层可能会由于数据的保持更浪费资源
    MVC是思路(方法),不存在“价值”问题。
    struts是框架而不是模式,请注意他们的区别
      

  14.   

    唠叨老大又复活了!这几天忙啥去了【quote】多谢你的回答,我还有两个问题请教一下【/quote】1.sorry,我没看过xoops的代码,所以只是根据你给出的代码做出理解,你这里的代码可能不全,所以我也不清楚它这样做的具体目的。国外好多代码需要用zend进行调试才能看明白。总之它用引用的目的就是为了不多创建多个连接对象,这样可以节省资源。关于引用的更多解释你可以查一下php手册。2.我就是采用二层模式,封装一些自己写的类,然后VIEW层去调用。目前我还没在php中用过第三方框架来开发过程序,只是看过一些zend framework的文档,我都是根据自己需要和习惯,封装了一些类,每次做开发都用这些类。算是我自己的"框架"吧。相信大多数做php的都是这样。3.我水平并不高,边工作边学习。我是生在北京长在北京的,也在北京工作。暂时没有换工作的打算,谢谢你了。