免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2260 | 回复: 13
打印 上一主题 下一主题

初学OOP,请教关于构造函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-18 11:48 |只看该作者 |倒序浏览
刚刚拜读了两篇精华,受益非浅。不过还有一个关于构造函数的问题:

我看到《轻量级OO框架》中:

  1. <?php

  2. // @author Liao Yu Lei <daut@dualface.com>;
  3. // @version $Id$

  4. require_once ('PEAR.php');

  5. class Application extends PEAR
  6. {
  7.    // private
  8.    var $_db = null;

  9.    // public
  10.    function Application() {
  11.       $this->;PEAR();
  12.       // 设置PEAR的错误处理方式,这样可以减少很多错误判断代码
  13.       PEAR::setErrorHandling(PEAR_ERROR_DIE);
  14.    }

  15. .............................................

  16.    function run() {
  17.       $action = strtolower($this->;getAction());
  18.       $page_class_name = ucfirst($action) . 'Page';
  19.       $page_class_file = APPROOT . '/includes/class_' . $action . '.php';
  20.       @include_once($page_class_file);
  21.       if (!class_exists($page_class_name)) {
  22.          die ("需要的 class(${page_class_name}) 没有定义
  23. ;类定义文件 \"" .
  24.               $page_class_path . "\" 无法找到");
  25.       }
  26.       $page = & new $page_class_name($this);
  27.       $page->;execute();
  28.       exit ();
  29.    }
  30. }
  31. ?>;
复制代码


index.php:
  1. require_once(APPROOT . '/framework/class_application.php');
  2. $app = & new Application();
  3. $app->;run();
复制代码





我的问题是,function run() 中的程序放到 function Application(),如果可以的话,index.php中最后一行$app->;run(); 是不是也可以不要的,那样岂不是更加简洁   

论坛徽章:
0
2 [报告]
发表于 2004-03-18 14:24 |只看该作者

初学OOP,请教关于构造函数

是有点高明,好象不符合OOP吧

论坛徽章:
0
3 [报告]
发表于 2004-03-18 22:19 |只看该作者

初学OOP,请教关于构造函数

[quote]原帖由 "HPstupid"]是有点高明,好象不符合OOP吧 [/quote 发表:


不知道你说的“符合”OOP是指什么?难道就是形式吗?或者难道OOP会拒绝简洁的形式?

如果非要 $app->;run(); 一下的话,那么 function Application() 里的代码放到 function run() 中去好了, function Application() 不也可以删掉了吗?

我是觉得全部放到构造函数中就可以了,也不会对结构或者思路有影响。这么理解不知道有无不妥?

请高手指点迷津

论坛徽章:
0
4 [报告]
发表于 2004-03-19 01:19 |只看该作者

初学OOP,请教关于构造函数

之所以叫做构造函数,就是为了在对象生成时进行一些初始化工作。所以你要把run放到构造函数里面确实可以,只是不符合OOP的思想而已。

而且在小程序里面这么做的弊端还看不出来,但是当一个程序变大以后,多人合作时。别人就无法理解为什么对象生成之后就发生了那么多预料之外的事情。

论坛徽章:
0
5 [报告]
发表于 2004-03-19 19:45 |只看该作者

初学OOP,请教关于构造函数

明白了。

另外还有一个问题请教dualface,按照《轻量级OO框架》,如果有一些全局各个“action”类都需要用到的方法/函数,应该放在哪里好呢?

我的理解,如果从结构的需要,放在 class Page 里边应该可以吧,不知道这样对不对?十分菜鸟的问题,请多多包涵。。。

论坛徽章:
0
6 [报告]
发表于 2004-03-19 20:50 |只看该作者

初学OOP,请教关于构造函数

请教谈不上。如果是每个action都要用的,就放在class page里面好了。

严格的讲,涉及到页面显示的内容就放在class page或者继承类里面,与页面显示无关的就不放在这里了。但是本来就只是个很简单框架,没必要分那么多块,所以只要是一系列action(例如login\logout)都做在一个class page的集成类里面了。现在看来class page改名为class action也许更合适,

而且进一步细分的话,class application用于封装整个网站需要的基本功能、class action封装一个动作、class page封装页面显示

论坛徽章:
0
7 [报告]
发表于 2004-03-20 11:39 |只看该作者

初学OOP,请教关于构造函数

又学到了 不过还有非常多的问题要请教,大侠不会嫌我烦吧?

1、这句话不是很理解,如果 class Page 中没有放这个execute() 这个函数也不会影响吧?
execute() 这个函数还记得吗?是 Application->;run() 调用的,是 Page 类的执行入口。Page 类的 execute() 应该是个抽象函数,但因为 php4 还不支持,所以就写个 die 在里面。


2、同样,既然在继承类class MyPage中有了_defaultTemplateVariables(),为什么class Page里边也要放一个?
_defaultTemplateVariables() 是个非常有用的函数,不过 Page 里面的实现只是返回一个空 array。


3、我这两天也看过一两篇介绍 MVC 的文章(虽然对于我来说还有些深 ),我的感觉 class Application 应该就是起一个 controller 的作用吧?而class Page以及各个具体的Page类,看来就是M和V混合了。--这样理解不知道对否?我注意到还有一个class MyPage,是不是您已经打算把显示部分独立出来做另一个类呢?否则似乎可以跟class Page合而为一吧?
现在看来class page改名为class action也许更合适,

而且进一步细分的话,class application用于封装整个网站需要的基本功能、class action封装一个动作、class page封装页面显示


4、我想把数据库的初始化也从class Application中转移到class Page,这样就不需要单单为了一个数据库对象而传递从前者的对象给后者了,因为数据库在application中其实根本没有用上:
$page = & new $page_class_name($this);
如果是每个action都要用的,就放在class page里面好了。


问题暂时就是这么多。目前的自我感觉,我的思维还是停留在面向过程的方式,OOP我完全可以接受,也可以用来写些东西了,但是思路经常还是用过程那一套,所以OOP对我来说还只是一种形式。不知道大侠有何诀窍可以帮助我转过这个弯来。谢谢!

论坛徽章:
0
8 [报告]
发表于 2004-03-20 12:45 |只看该作者

初学OOP,请教关于构造函数

1、这句话不是很理解,如果 class Page 中没有放这个execute() 这个函数也不会影响吧?
引用:
execute() 这个函数还记得吗?是 Application->;run() 调用的,是 Page 类的执行入口。Page 类的 execute() 应该是个抽象函数,但因为 php4 还不支持,所以就写个 die 在里面。


在page里面写一个execute主要是为了提醒程序员不要忘了在继承类中重写execute方法。


2、同样,既然在继承类class MyPage中有了_defaultTemplateVariables(),为什么class Page里边也要放一个?
引用:
_defaultTemplateVariables() 是个非常有用的函数,不过 Page 里面的实现只是返回一个空 array。


_defaultTemplateVariables()的作用是为模板设置一些默认的变量,例如CSS文件位置等。由于page类里面调用了_defaultTemplateVariables(),如果page的继承类没有重写_defaultTemplateVariables()方法的话就会在调用时出错。而我是从page派生了一个mypage继承类,这样可以就在mypage里面重写_defaultTemplateVariables()方法,而不用在每一个page继承类里面都重写_defaultTemplateVariables()了。因为这些继承类都不是从page继承,而是从mypage继承。


3、我这两天也看过一两篇介绍 MVC 的文章(虽然对于我来说还有些深  ),我的感觉 class Application 应该就是起一个 controller 的作用吧?而class Page以及各个具体的Page类,看来就是M和V混合了。--这样理解不知道对否?我注意到还有一个class MyPage,是不是您已经打算把显示部分独立出来做另一个类呢?否则似乎可以跟class Page合而为一吧?
引用:
现在看来class page改名为class action也许更合适,
而且进一步细分的话,class application用于封装整个网站需要的基本功能、class action封装一个动作、class page封装页面显示  


M是业务逻辑、V是视图、C是控制器。我这个框架里面application和page合作完成了这三者的功能。application为page提供一些基本的服务,例如连接数据库、初始化模板引擎等,而page则提供视图的基本功能,page的继承类则实现了具体的业务逻辑。

4、我想把数据库的初始化也从class Application中转移到class Page,这样就不需要单单为了一个数据库对象而传递从前者的对象给后者了,因为数据库在application中其实根本没有用上:
$page = & new $page_class_name($this);
引用:
如果是每个action都要用的,就放在class page里面好了。


之所以把数据库的初始化放到application里面,是因为当初考虑到page只完成页面显示功能(实际上后来不是这样)。

总的来说,这个框架设计上有很多不合理的地方,所以我一直在做项目时进行改进。目前大概是改成了这个样子:

Application - 提供初始化运行环境的,分析$_GET['action']。然后通过ActionMap对象生成对应的action对象。调用action对象的execute方法。当action对象需要显示内容时生成page对象,调用page对象的display方法。

论坛徽章:
0
9 [报告]
发表于 2004-03-20 13:54 |只看该作者

初学OOP,请教关于构造函数

多谢指点,慢慢看

论坛徽章:
0
10 [报告]
发表于 2004-03-20 18:15 |只看该作者

初学OOP,请教关于构造函数

看你们讨论的这么热闹我也来掺和掺和
我的问题是,function run() 中的程序放到 function Application(),如果可以的话,index.php中最后一行$app->;run(); 是不是也可以不要的,那样岂不是更加简洁

其实你这么做也是可以的,但是让用这个类写程序的人会觉得很不舒服。就好像你们家的电视没有开关,插上电就亮了,拔了电就灭了。你肯定会觉得很难受。但是有些东西我们也会根据需要设计成没有开关的样子,比如说电子表,装上电池就走了,不太需要什么开关,因为时间是不会停止的,表也应该是这样工作的对吧。
总的来说人们希望对事物能够有所控制,全部人类活动就是对于控制权的争夺,你的父母希望控制你的未来,你的老师希望控制你的学习,你的老板希望控制你的工作,你的老婆希望控制你的生活,你希望能够控制自己的金钱和欲望(尽管这个很难做到)。

目前的自我感觉,我的思维还是停留在面向过程的方式,OOP我完全可以接受,也可以用来写些东西了,但是思路经常还是用过程那一套,所以OOP对我来说还只是一种形式。不知道大侠有何诀窍可以帮助我转过这个弯来。谢谢!

其实OOP的东西很简单,如果你很难转过弯来,说明学校对于你的控制是非常有效和成功的。   理解和使用OOP的方式很简单,但是需要借助两件东西“懒惰和本能”这两样我想每个人都不缺吧。每次需要进行OOP设计的时候用你最懒惰的思想来设计就行了。试试看?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP