Chinaunix

标题: [心得 对象] OOP的PHP长啥样 [打印本页]

作者: shukebeita    时间: 2003-12-17 11:51
标题: [心得 对象] OOP的PHP长啥样
在PHP的论坛中总是听到有人对PHP的OOP支持说三道四的,说这有缺陷,那里不足,但是都拿不出实际的例子。原来说过要和大家说说这事,但是一直很忙,现在算是抽了些时间了,所以把我刚刚做过的一个项目的框架拿出来和大家探讨一下。这个项目99%的代码是用oop方式编写的,感觉PHP对于OOP支持非常好,不是一般的好,是非常的好。有由于项目本身是一个商业项目所以源代码不好公布出来,但是基本框架还是可以说一说的,而且经过简化的例子更容易理解一些。如果你对PHP中的OOP还不太了解,还是就此打住吧,先去看看手册,或者基础读物再来看也不迟,反正这个是贴子没有长腿也跑不了。

长话短说,立刻开始吧。我这里会用到一个简单的例子,只有一个半的功能。一个是向浏览器发送一句"Hello, I can say OOP in PHP world!",另外半个功能是从数据库中进行一个查询然后输出到浏览器,说它是半个功能是因为只是作为一个例子讲讲没有实际的数据库操作。

首先从我的第一个文件index.php 开始介绍吧。我的index.php文件是这样的:

  1. <?php
  2. include_once ('config.php');
  3. include_once ('class.Application.php');
  4. $app = & new Application();
  5. $app->;run();
  6. ?>;
复制代码

这个就是全部了,虽然只有4行,但是如果用OOP的方式写这个应该就够了吧。
有一点经验的哥们会发现这里只用到了一个Application 对象,那么一定很想知道这个对象究竟长什么样呢?我们继续看看class.Application.php 这个文件的内部。从以上的代码中我们知道她应该至少包含两个方法
Application()

run()
所以大体上应该长成这样

  1. <?php

  2. class Application
  3. {
  4.         function Application()
  5.         {

  6.         }

  7.         function run()
  8.         {

  9.         }
  10. }

  11. ?>;
复制代码

现在就算知道Application 是什么样,它好像也没有办法完成我们预先设定的功能呀? 所以还要介绍一下如何运行这个程序,在我的结构中所有的页面都是通过index.php和一个action参数进行访问的例如第一个功能应该这样访问index.php?action=HelloPage,而第二个功能则是通过index.php?action=DatabasePage进行访问。这样的结构大家也许并不陌生吧。所以index.php 页面应当知道传进来的 action 参数是什么,也就是说Application对象应当知道 这个action 参数是什么。所以我们需要给Application增加一个方法 getAction()来获得action参数。既然知道action,知道了要做什么,那么方法 run()也就有知道如何去run了。

同时我还可以把(完成功能的)每一个页面作为一个对象来看待,所以我应该至少还需要两个类
class HelloPage 和
class DatabasePage
由于这两个对象最终都是向浏览器发送页面所以把他们共同的部分提出来作为他们的父类
class Page
以下是三个类文件的内容

class.Page.php

  1. <?php

  2. class Page
  3. {
  4.         function Page()
  5.         {
  6.        
  7.         }

  8.         function show()
  9.         {
  10.                 //不能直接调用这个方法一定要在子类中去具体实现。
  11.                 die('You can not use this funciton directly from Page class');
  12.         }
  13. }
  14. ?>;
复制代码

其中这个show方法应该是所有页面对象都具有的方法,只是在实现上有所不同。

class.HelloPage.php

  1. <?php
  2. require_once ("class.Page.php");

  3. class HelloPage extends Page
  4. {
  5.         function HelloPage()
  6.         {
  7.                 parent::Page();
  8.         }

  9.         function show()
  10.         {
  11.                 echo "Hello, I can say OOP in PHP world!";
  12.         }
  13. }
  14. ?>;
复制代码


class.DatabasePage.php

  1. <?php
  2. require_once ("class.Page.php");

  3. class DatabasePage extends Page
  4. {
  5.         function DatabasePage()
  6.         {
  7.                 parent::Page();
  8.         }

  9.         function show()
  10.         {
  11.                 //做一些数据库操作然后将结果显示出来。
  12.         }
  13. }
  14. ?>;
复制代码


同时我们还遵守这样的一条规则:action的值和调用的页面类的名称保持一致,例如当action=HelloPage的时候程序就知道需要初始化一个HelloPage的对象,有了这样的规则和以上的几个文件我们就可以将 Application 类改进成这样。

  1. <?php

  2. class Application
  3. {
  4.         function Application()
  5.         {

  6.         }

  7.         function getAction()
  8.         {

  9.         }

  10.         function run()
  11.         {
  12.                 $pageClass = $this->;getAction();
  13.                 include_once ("class.".$pageClass.".php");
  14.                 $page = & new $pageClass();
  15.                 $page->;show();
  16.         }
  17. }

  18. ?>;
复制代码

为什么getAction()空着?因为它太简单了,你自己可以轻松地把它写出来呀。

看到这里,如果你还不太明白,不用急,可以停下来重新再看一遍。

如果全明白了,我们就继续前进。我们还有半个任务没有完成,所以我们需要改进我们的Application和页面类,让它完成数据库操作功能。
进行数据库操作之前首先应当得到一个正确的数据库连接,如果让每个需要数据库连接的页面类去做这样的工作实在是一件非常费时费力的工作,不容易维护管理而且也破坏了oop的设计初衷,进行数据库操作的页面类例如 DatabasePage 只应当完成它份内工作即获得数据。 仔细看看我们的设计不难发现建立数据库连接的工作交给 Application 来做最合适不过了, 所以给Application 增加一个新的成员 $db 并且在初始化的时候将建立的数据库连接赋值给它。


  1. <?php
  2. require_once ("class.Database.php");

  3. class Application
  4. {
  5.         var $db;//数据库对象

  6.         function Application()
  7.         {
  8.                 $this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);//$db 现在是一个数据库对象了
  9.         }

  10.         function getAction()
  11.         {
  12.                 return $_GET['action']; //简单的实现 getAction;
  13.         }

  14.         funciton & getDatabase()
  15.         {
  16.                 return $this->;db;
  17.         }

  18.         function run()
  19.         {
  20.                 $pageClass = $this->;getAction();
  21.                 include_once ("class.".$pageClass.".php");
  22.                 $page = & new $pageClass($this); //这里是唯一做了手脚的地方,将这个Application对象传给页面对象。
  23.                 $page->;show();
  24.         }
  25. }

  26. ?>;
复制代码

你现在不用太关心这个 Database对象从何而来如何实现,知道它是一个含有数据库连接的对象就可以了,如果用过phplib, ADODB,或者Pear库的就很容易理解。
这个语句:
$this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);
就是建立一个数据库连接而已。

至于DB_HOST,DB_NAME,DB_LOGIN,DB_PASS 这些都是常量我们在config.php中已经预先设定。

由于数据库操作页面 DatabasePage 需要进行数据库连接所以它也需要一个变量 $db 来保存数据库对象,所以我们需要把DatabasePage改进成这样:

class.DatabasePage.php

  1. <?php
  2. require_once ("class.Page.php");

  3. class DatabasePage extends Page
  4. {
  5.         var $db;

  6.         function DatabasePage(&$app)//将Application对象作为参数接受。
  7.         {
  8.                 parent::Page();
  9.                 $this->;db = $app->;getDatabase();//获得 Application 中的数据库对象。
  10.         }

  11.         function show()
  12.         {
  13.                 $sql = 'SELECT * FROM sale_orders';//简单的一个 SQL 例子。
  14.                 $results = $this->;db->;query($sql);//query 是 Database对象的一个公共的方法,通过它向数据库提交SQL查询。
  15.                 ...;//做一些操作把得到的结果显示出来。
  16.         }
  17. }
  18. ?>;
复制代码

好了,一个半的功能算是完成了,PHP对于OOP支持得也很漂亮吧,结构清晰,维护方便,至于效率嘛,我可没看出来有什么损失,如果你有兴趣可以自己测试一下。用这样的框架可以轻松应对各种需求的变化:增加各种权限控制,分离数据库层,商业逻辑,和表象层,增加远程调用接口统统不成问题,只是这里实在写不完这么多的东西。真不知道谁还会有理由说PHP 中OOP 很烂呢?

另外,需要提醒大家的是传递对象和赋值的时候要使用 & 符号这样可以保证每次引用的是同一个对象。

[ 本帖最后由 HonestQiao 于 2006-5-26 21:14 编辑 ]
作者: mikespook    时间: 2003-12-17 12:03
标题: OOP的PHP长啥样
其实我一直在想~~能不能模仿ASP.NET那样~~~

比如表格,我们可以设计一个表格的类~~~文本框我们可以生成文本框的类~~然后设计一种方式触发事件~~~就像ASP.NET的客户端控件那样~~
如果能设计出完整的PHP的类,那么我们就可以像在ASP.NET里调用客户端控件那样调用这些类~~~在客户端显示我们需要的内容~~

说白了就是学SERVLET和ASP.NET的那套~~~
作者: NightKids    时间: 2003-12-17 13:20
标题: OOP的PHP长啥样
php5 的 class 样式

  1. class TClassName{
  2.     private $_PrevateVar="hahah";
  3.     protected $_ProtectedVar="hehehehe";
  4.   
  5.    function __construct(){
  6.     //真正的构造函数
  7.    }

  8.    function __destruct() {
  9.        //真正的释购函数
  10.    }

  11.    

  12.     private function privateFunction(){
  13.          try{
  14.            //抛出异常
  15.            throw new MyExceptionFoo('Hello');
  16.         }catch(MyException $exception) {
  17.           //...............
  18.         }
  19.    }

  20.    public function publicFunction(){
  21.          
  22.    }
  23. }

  24. class TSubClassname extends TClassName{
  25.          private function ().....

  26. }

  27. $obj = $obj->;__clone(); //对象的克隆
  28. ... 很多
复制代码


很多 ,到 http://www.php.net/zend-engine-2.php 看看。
我现在已经开始使用了。

以前常用的类似

return sprintf("aaaaa";
这样的写法在 php5 是严重错误,只能这样
$r = sprintf("fasdfasdf";
return $r;
作者: geel    时间: 2003-12-17 16:11
标题: OOP的PHP长啥样
有些时候用类麻烦一点。

但是看看新办主任的php5类,感觉越来越像c++了,呵呵,高兴啊。
作者: lilyzyp    时间: 2003-12-17 16:23
标题: OOP的PHP长啥样
OOP的东东 我也是刚学
觉得PHP越来越向C++靠拢了
支持PHP  支持面向对象
作者: iamyess    时间: 2003-12-17 17:08
标题: OOP的PHP长啥样
说我吗? 我可一直都没说这观点哦
作者: shukebeita    时间: 2003-12-17 21:45
标题: OOP的PHP长啥样
原帖由 "mikespook" 发表:
其实我一直在想~~能不能模仿ASP.NET那样~~~

比如表格,我们可以设计一个表格的类~~~文本框我们可以生成文本框的类~~然后设计一种方式触发事件~~~就像ASP.NET的客户端控件那样~~
如果能设计出完整的PHP的类,那么..........

我不太懂ASP .net的东西,但是你可以看看这个是不是你希望的,或者可以在这个库的基础上改进成你所希望的呢?
http://phphtmllib.newsblob.com/

[quote]原帖由 "iamyess "]说我吗? 我可一直都没说这观点哦...[/quote 发表:
呵呵~~,你又回来啦。这个贴子只是我的一些经验的总结,没有针对什么人的目的。就事论事,欢迎讨论!
作者: iamyess    时间: 2003-12-17 21:54
标题: OOP的PHP长啥样
不好意思,我又来砸场子

不错,你是写出了个例子,还是实例  :em11:

但是,但是:

你上面说的

"感觉PHP对于OOP支持非常好,不是一般的好,是非常的好"

有什么实际关系呢?也就是说 这个例子能说明什么呢,说明它对 oop 支持得非常好?比一般过程好在哪?

new class 不等于就是  oop
作者: 夜猫子    时间: 2003-12-17 22:41
标题: OOP的PHP长啥样
想请问iamyess,你心里的OO是什么样子,老实说对OO的误解是如此之多,连我都无法肯定我心中的OO到底是不是真正的OO,愿意看看你的理论以印证之。
作者: shukebeita    时间: 2003-12-18 00:19
标题: OOP的PHP长啥样
[quote]原帖由 "iamyess" 发表:
不好意思,我又来砸场子

不错,你是写出了个例子,还是实例  :em11:

但是,但是:

你上面说的

"感觉PHP对于OOP支持非常好,不是一般的好,是非常的好"

有什么实际关系呢?也就是说 这个例子能说明
作者: longnetpro    时间: 2003-12-18 06:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: mikespook    时间: 2003-12-18 12:35
标题: OOP的PHP长啥样
原帖由 "shukebeita" 发表:
我不太懂ASP .net的东西,但是你可以看看这个是不是你希望的,或者可以在这个库的基础上改进成你所希望的呢?
http://phphtmllib.newsblob.com/


哈哈,就是这种东西~~~我仔细看看~~~
作者: mikespook    时间: 2003-12-18 12:37
标题: OOP的PHP长啥样
原帖由 "iamyess" 发表:
不好意思,我又来砸场子

不错,你是写出了个例子,还是实例  :em11:

但是,但是:

你上面说的

"感觉PHP对于OOP支持非常好,不是一般的好,是非常的好"

有什么实际关系呢?也就是说 这个例子能说明?.........


我不是很明白你要表达的意思~~~对OO支持好和对过程支持好并不矛盾啊~~~
好比C++不论是面向过程还是面向对象,都是利器么。
作者: NightKids    时间: 2003-12-18 15:53
标题: OOP的PHP长啥样
无论用什么,只有做技术的才关注,最终是要看结果,否则没饭吃。
作者: iamyess    时间: 2003-12-18 15:55
标题: OOP的PHP长啥样
哦,不不不

我不是想钻牛角尖

只是想问一个问题,oop 不是开发效率高,维护好吗? 那这段代码阐述了

比过程优越的哪个方面呢?

我不是要打击大家的积极性啊,我也不是要老要当坏人,当有些问题是必须理清楚的,这也是为大家好,不然大家用了 class ,但依然用 非 oo 思想写东西,那...
作者: 夜猫子    时间: 2003-12-18 16:12
标题: OOP的PHP长啥样
>;我不是要打击大家的积极性啊,我也不是要老要当坏人,当有些问题是必须理清楚的,这也是为大家好,不然大家用了 class ,但依然用 非 oo 思想写东西,那...

了解了你的好意,这个问题也应该从另外一个方面来看,并非非要把每个问题都说得面面俱到,有时候我们发帖子仅仅是想就一个方面进行讨论,至于其他方面的比较,各自根据自己的经验比较就可以了,如果每次都要照顾这么周全,岂不是有点累。
另外,象这个帖子,如果你觉得有些地方可以补充,比如“比过程优越的哪个方面呢?”,你可以跟帖进行说明,那就是锦上添花。
作者: shukebeita    时间: 2003-12-18 19:13
标题: OOP的PHP长啥样
原帖由 "iamyess" 发表:

只是想问一个问题,oop 不是开发效率高,维护好吗? 那这段代码阐述了 比过程优越的哪个方面呢?

要不我看这样,玩一点有意思的,例子里面我已经有了两个功能。接下来可以让斑竹或者大家出些题目来扩充那个简单的例子,比如增加权限控制,远程调用,短信接口,数据库移植等等。每周一轮一个题目,我们各自来试着完成这个题目,然后把代码发出来试一试看一看。大家可以献计献策,可以找高人帮忙,可以使用各种现成的php软件包,可以抄袭剽窃。只有两个规则

规则一:iamyess 必须使用过程式的方式完成。

规则二:shukebeita 必须使用OOP的方式完成。

3,5轮以后来个总评,大家投票,发表感想,优势如何,效率如何,你看如何?
作者: longnetpro    时间: 2003-12-18 20:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: iamyess    时间: 2003-12-20 14:55
标题: OOP的PHP长啥样
原帖由 "shukebeita" 发表:

要不我看这样,玩一点有意思的,例子里面我已经有了两个功能。接下来可以让斑竹或者大家出些题目来扩充那个简单的例子,比如增加权限控制,远程调用,短信接口,数据库移植等等。每周一轮一个题目,我们各自来试着?.........


这可很有意思的,还很要命~~~

不过要没大型的东西在开发过程做比较还真难说明,这一问题

不为难你了,我收回我的话  

我劝各位初学者不用急着学 oo ,那只是形式,掌握里面的东西才是重要的,所以要狂比较和思考先,不然就挂羊头卖狗肉了
作者: mikespook    时间: 2003-12-20 15:17
标题: OOP的PHP长啥样
[quote="iamyess"]
我劝各位初学者不用急着学 oo ,那只是形式,掌握里面的东西才是重要的,所以要狂比较和思考先,不然就挂羊头卖狗肉了 quote]
……………………

我又无语了~~~
作者: shukebeita    时间: 2003-12-20 19:03
标题: OOP的PHP长啥样
原帖由 "iamyess" 发表:

不过要没大型的东西在开发过程做比较还真难说明,这一问题不为难你了

其实也不是什么真的要命的东西,就是比较费时间,耽误挣钱。不玩就不玩了,我也害怕玩物丧志的。  其实题目小一些也是可以的。只要动起来就能比较出来这个和参禅悟道一样一滴水,一片云足以,何需轰轰烈烈,生离死别呢?


[quote]原帖由 "iamyess" 发表:

我劝各位初学者不用急着学 oo ,那只是形式,掌握里面的东西才是重要的,所以
作者: longnetpro    时间: 2003-12-21 02:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: anson_x    时间: 2003-12-21 11:30
标题: OOP的PHP长啥样
总的感觉来说,还是觉得过程的比较难维护,OO的比较好些
作者: iamyess    时间: 2003-12-21 13:13
标题: OOP的PHP长啥样
不不

你都不说过

not just words like "class","public" or "private"........

要真正领悟才是正路

我不是要鼓励大家偏学哪一样哦,我是劝大家从过程开始

再学 oop ,就会知道不同在哪,好在哪

当然,如果能直接领悟 oo 思想那我也就认了
作者: tonera    时间: 2003-12-21 13:54
标题: OOP的PHP长啥样
过程和oop的利弊,就像和尚头上的虱子,明摆着嘛。关键是看实际需要啰。

在大型的复杂一些的项目中,如果不用到OO,简直就是恶梦。
维护的工作量可能跟重新开发的工作量一样大,谁受得了?

相反,如果只是计算1+1=2,也用OOP来搞,就很没道理了。
作者: iamyess    时间: 2003-12-21 17:12
标题: OOP的PHP长啥样
是我表达的不清楚吗?怎么回答的都不对题啊

错的是我~~~~~~~~~~~
作者: mikespook    时间: 2003-12-21 21:01
标题: OOP的PHP长啥样
原帖由 "iamyess" 发表:
不不

你都不说过

not just words like "class","public" or "private"........

要真正领悟才是正路

我不是要鼓励大家偏学哪一样哦,我是劝大家从过程开始

再学 oop ,就会知道不同在哪,好在哪

当..........

不觉得从过程学起和从面向对象学起有什么特别的不同~~~
而且我觉得在理解能力有限的情况先先从面向过程学起,反而会影响面向对象的学习。弄得不论不类~~
作者: tonera    时间: 2003-12-21 22:14
标题: OOP的PHP长啥样
原帖由 "iamyess" 发表:
是我表达的不清楚吗?怎么回答的都不对题啊

错的是我~~~~~~~~~~~


没有绝对的对与错,讨论就是这样的,不是一定要讨论出胜负,而是封装大家的思想精华。这样目的就达到了。看来你这个人很执着啊。

正在搞一个稍大点的东西,觉得在涉及数据库的操作时,如果针对的表很少,只用函数效率高一些。如果同时操作的表很多,(例如三个以上)使用OOP的方式是很好的方法。我只用写一个基类,几个派生类就OK了。继续中...
作者: 网络混混    时间: 2004-01-09 06:24
标题: OOP的PHP长啥样
原帖由 "shukebeita" 发表:

要不我看这样,玩一点有意思的,例子里面我已经有了两个功能。接下来可以让斑竹或者大家出些题目来扩充那个简单的例子,比如增加权限控制,远程调用,短信接口,数据库移植等等。每周一轮一个题目,我们各自来试着?.........



强烈支持
作者: 网络混混    时间: 2004-01-09 06:28
标题: OOP的PHP长啥样
OOP不OOP关键在于思想,不在于形式;

就算不用oop形式写,也能写出有OOP的程式;

用OOP写,没有OOP思想的代码会写成过程式的!
作者: longnetpro    时间: 2004-01-09 12:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: NightKids    时间: 2004-01-09 22:15
标题: OOP的PHP长啥样
既然提到题目,我就提出一个:

就写一个像 CU 的站内短信吧,大家来评一下用什么方式做的好维护。
维护包括功能的增减,页面显示的修改等。
作者: lem    时间: 2004-01-12 21:33
标题: OOP的PHP长啥样
[quote]原帖由 "shukebeita"]好了,一个半的功能算是完成了,PHP对于OOP支持得也很漂亮吧,结构清晰,维护方便,至于效率嘛,我可没看出来有什么损失,如果你有兴趣可以自己测试一下。用这样的框架可以轻松应对各种需求的变化:增加各种权限控制..........[/quote 发表:


推荐 PHPMVC 框架,很好。
作者: odin_free    时间: 2004-01-13 10:03
标题: OOP的PHP长啥样
原帖由 "iamyess" 发表:

我不是要鼓励大家偏学哪一样哦,我是劝大家从过程开始

再学 oop ,就会知道不同在哪,好在哪

当..........


其实没必要 虽然我是这么学的
作者: hongweig    时间: 2004-02-24 09:31
标题: OOP的PHP长啥样
感谢楼主的帖子。

我没有看完整个帖子,
但是对于楼主的初学都一开始就要学习oop的说法,持不赞同的态度。

个人比较同意iamyess 的说法,oop是一种编程思想,但是过程式的编程思想一样很重要。初学者如果连过程式的编程方法都无法理解,那么对于oop怕更是一愁莫展了。

不推荐一开始就学习oop编程方法。

但是对于楼主在php中的oop的应用持赞同的意见 。

php非常不错。也非常好。
作者: shukebeita    时间: 2004-02-24 10:23
标题: OOP的PHP长啥样
原帖由 "hongweig" 发表:

我没有看完整个帖子,


其实还是看完了比较好。我不是专业计算机出身的,深知自学之艰辛,现在算是有了一些经验所以来论坛里想和大家交流一下。我来这里发的贴子基本上都是自己的血汗。在我的机器上跑不出来的代码是不会贴出来的。所以汗血量应该不低。

至于是不是一开始学习PHP就要学习OOP,每个人都有可能都有些看法。也许很多人因为从开始学习编程的时候接触的就是过程的方式,所以发现理解OOP比较难一点。但是这并不能说明学习编程一定要走这种方式,恰恰相反,如果对于初次学习编程的而言,直接学习理解OOP也许更加容易。这个就和学习外语一样,语言没有高低贵贱,只是不同而已,没有规定一定要先学中文再学英文。

其实对于初学者而言其他的一些东西比 OOP更重要比如:好的变量命名习惯,代码书写习惯,设计良好的API接口,如何阅读别人的代码,如何注释等等。

这一篇自认为是最有价值的一贴了,可能过长了很少有人能看完。倒是那个近似于八卦的利器一箩筐之类的东西被人转来转去的,的确有些费解。  
作者: longnetpro    时间: 2004-02-24 10:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: longnetpro    时间: 2004-02-24 10:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongweig    时间: 2004-03-03 08:48
标题: OOP的PHP长啥样
我也不知道,我也许是接触编程的时候,97年左右,那个时候还没有oop理论很兴盛,所以考虑问题是站在机器的角度,学会如何使用机器的思维来说话,所对于oop来说很长一段时间是比较难以理解的。

呵呵,我说没有看整个帖子,是没有看完所有的讨论,顶楼的贴子我可是看了好几遍。
今天又再次重看。呵呵。
作者: hongweig    时间: 2004-03-03 08:57
标题: OOP的PHP长啥样
shukebeita, longnetpro  呵呵,我也不是计算机科班出身的。

自学之难深有体会。

不过对于二位观点还是有不同意的地主,
楼上说的观点我不敢反驳,不错,虽然一直以来很多人都认为oop是应该与生俱来,是很自然的事情。但是实际上从这么多年的开发历史来看,oop并非是新鲜事物,而只到这些年才真正的兴盛起来,这说明oop中还是存在着很多问题,当然oop这种开发思想能够很好的解决过程式开发中存在的一些问题,但是没有过程式的开发思想何来oop?

现在也有哪一种语言敢自称是完全的oop?连java不敢不这么说啊。

而且对于刚开始编程的人来说一下就接触oop,而不知道什么是过程式编程语言,怎么可能理解oop呢?也许二位说不可能,那是因二位是从过程式编程中过渡来的,已经理解了这些东西,真要从oop开始学起,怕不是那么好说吧。

不说别的,你让一位计算机系的学生去读《java编程思想》这本书,看看有多少人能够很好的接受?
作者: shukebeita    时间: 2004-03-03 10:13
标题: OOP的PHP长啥样
原帖由 "hongweig"]而只到这些年才真正的兴盛起来,这说明oop中还是存在着很多问题[/quote 发表:


的确OOP中还有一些问题,   但我在论坛中的还没有看到一个反OOP的说到点子上。这些年才真正的兴盛起来的真正原因是由于计算机硬件发展和软件应用的深度和广度的不断提高。对于程序和程序开发过程中互通合作的要求也不断提高,人们为了应对这些面的挑战不断寻找着新的出路,所以OOP在这些方面的优势更加得到人们的重视。

[quote]而不知道什么是过程式编程语言,怎么可能理解oop呢?

记得96年的时候曾经尝试学习Windows编程(那时我第一次听到这个令人迷惑的词“面向对象”)。因为以前学过一些C之类的东西,所以总想找到那个main函数到底在哪里,对于消息机制也很难理解,总觉得应该有一个死循环在那里,但始终没有结果。用现在的话说就是郁闷至极,最后也只好放弃了。

而真正让我体会到OOP的竟然PHP。学起PHP我再也不用寻找什么main函数了,http 访问也很快让我理解什么叫消息机制。为了写出更好的脚本我需要学习分离事务逻辑,和表现逻辑,OOP的思想很自然的就进入我的脚本里了并没有感到什么障碍,反而觉得轻松和愉快。现在回头看看那些java 和C++的代码,我自己都感到奇怪,我竟然能够看懂了。所以最近我在教一个(完全没基础的)学生学习PHP的时候就让他只看到 函数那个章节(因为函数是封装的最基本单位)而后就开始学习用类来编程,训练他用oop的眼光来寻找解决问题的方法,目前进展不错。

  1. 自称是完全的oop?连java不敢不这么说啊。
复制代码

据说有一种叫smalltalk的东西自称是完全的oop,有机会你可以试一试,免费的呦。
其实OOP完全是思想和语言没有大关系。所以也就不存在什么完全OOP的语言了。
作者: hongweig    时间: 2004-03-03 12:20
标题: OOP的PHP长啥样
smalltalk是一种很古老的语言,java的oop大多是借用它的。这种语言应用并不广。

呵呵,让我真正理解的oop是python.

而并非php.
作者: dualface    时间: 2004-03-04 00:55
标题: OOP的PHP长啥样
为什么要OO?
因为机器快了;软件大了;一个人搞不定了;维护花的钱多了。。。。。
作者: hongweig    时间: 2004-03-04 09:05
标题: OOP的PHP长啥样
为什么要OO?
因为机器快了;软件大了;一个人搞不定了;维护花的钱多了。。。。。


哈哈,楼上一言中的。

确是是这样。
不过,应该是人力成本过高才对哦。
一个人能力太有限。
作者: sports98    时间: 2004-03-16 18:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: yinhm    时间: 2004-04-05 16:48
标题: OOP的PHP长啥样
原帖由 "dualface" 发表:
为什么要OO?
因为机器快了;软件大了;一个人搞不定了;维护花的钱多了。。。。。


记得developerworks寄的一期专刊中有篇访谈说道了OOP,大致意思就是OOP并没有让软件开发效率提高多少,没有从根本上解放程序员,只不过原先可以写到1000行现在可以写到10000行了 ; )
作者: heiyeluren    时间: 2005-04-30 16:27
标题: OOP的PHP长啥样
我理解OO是C++
哈哈!!
作者: hightman    时间: 2005-05-01 02:30
标题: OOP的PHP长啥样
哎,呵榀. 深夜逛到这里,看来看去...

力推OOP的都是觉得面向过程的编程方式主要缺陷在于:代码很难重用\可维护性差! 让他维护面向过程的程序代码他就喊着不如重写(试试看好了!)

以下说法均指在PHP中...:p

我觉得通过 include 或 require 来调用所需要的代码段,代码按功能命名,分放到各目录中去....维护非常方便,既然可以抽像成函数(我觉得函数本身就是一个抽像),就不存在很难维护的问题了; 而OOP强调的封装, 通常来说,PHP的程序不像C一样只有一个入口,而是分段成数个PHP程序(相当于C中有数个main(),编译成好多支可执行程序), 完成某一个过程只需要少许函数就能完成了,OOP的形式却无故要装入很多无关的函数, 这一点让我觉得很不舒服.  代码的重用基本上都是函数的重用, 所以这点上非OOP并无任何劣势.

程序好不好维护主要和编程者的写法(甚至代码的排版)才有很大关系.

不管什么编程思想,在我看来(我也是旁学的,非科班,不懂也不需要懂什么太高深的思想)任何语言的程序除了加法运算,就是if 和 goto; 面向过程显得比较自然,符合常规的逻辑思维; 就是一个人爬树摘果子一样, 从下往上, 顺着果子找路子.

我自己PHP的学习使用过程中,也经常用到一些类啊什么的,都是一些相对很抽象的过程(比如MYSQL操作, SMTP对话等);非硬要把一些其它的东西封装,我感觉很别扭。

另一点,读别人的程序本来就累,需要较强的功力和很强的耐力才行。
就像楼主的例子,一个程序的主页面就四行程序(多数功能都只需这四行吧),看起来固然很养眼,但真要查错,修改维护时,还是一样要用人脑模拟电脑去运行程序,分析错误。。。。(小错误的话grep一下就行了)

上次特意去看C++的书,对于我来说让我看C++的程序生不如死。。。要改个程序又是重载+多态,又是封装。。。同样的函数名称,参数个数不一样函数的定义也不一样,结果也却完全不一样,搞不清楚改哪个地方,想模拟电脑走程序都不行哎。
作者: hightman    时间: 2005-05-01 02:34
标题: OOP的PHP长啥样
我觉得PHP这东西(4.x)还是过程式舒服,当然编程中你会发现有些过程差不多,不停的重复,却又不是一个函数可以抽象的时候,就可以用类来封装了。不抽象的东西也用类封装怎么感觉都不舒服,以前看过xoops的代码中关于多国语言支持的部分...

似乎也就把一些翻译,塞到一个类里,整类就一个函数的样子,感觉很不好。
作者: 钟钟.    时间: 2005-05-01 03:06
标题: OOP的PHP长啥样
提两点不同的意见:
1、PHP5的类虽然健全了一些,但还是有缺陷,比如只能继承一次在实际应用当中显得非常不方便,另外不支持重载(当然这可以通过设定参数的默认值再适当加一些判断来解决),再就象接口、抽象类什么的好像也都不支持。
2、提出以上的看法并不是说我认为PHP不好,我非常喜欢PHP,用一种语言,就要发挥它的优势,面向对象有它的优点,但并不是说面向过程就不能用了。通过合理的设计+有效的程序组织+部分的面向对象(我一般把核心、通用的东西用类封装),用PHP一样能够开发出强大、灵活的程序,而这,不一定就非得完全OO。
作者: ttvast    时间: 2005-05-03 15:35
标题: OOP的PHP长啥样
原帖由 "yinhm" 发表:


记得developerworks寄的一期专刊中有篇访谈说道了OOP,大致意思就是OOP并没有让软件开发效率提高多少,没有从根本上解放程序员,只不过原先可以写到1000行现在可以写到10000行了 ; )


这个可是OOP的致命伤.关于OOP的戏说可是不少.
我真正认识OO还是在PYTHON的源码中学到的.
不过,老实说oo的源代码真是很麻烦.一个方法,你根本不知道它的实现到底在哪个祖宗基类里实现的,何况运行的时候还会动态调用. 所以说,在OOP编程的时候,你只能假设基类是正确的,除了问题不管你的事情才行.
不过,编程序的人都知道,没有错误的程序是不存在的.
作者: imbiss    时间: 2005-05-03 17:22
标题: OOP的PHP长啥样
原帖由 "ttvast" 发表:


不过,编程序的人都知道,没有错误的程序是不存在的.

TeX 的祖师爷的一美元奖金的故事知道吗?
作者: liumingl    时间: 2005-05-09 15:05
标题: OOP的PHP长啥样
长知识!
作者: 云飞月    时间: 2005-05-10 21:16
标题: OOP的PHP长啥样
大大们都好厉害
作者: fnet    时间: 2006-05-23 16:13
不错,一会替你补点东西

[ 本帖最后由 fnet 于 2006-5-23 16:16 编辑 ]
作者: fnet    时间: 2006-05-23 16:15
替楼主补了个类和一个配置文件

config.php
  1. <?php
  2. /*
  3. 系统配置
  4. */
  5. #配置数据库
  6. define("DB_HOST","");
  7. define("DB_NAME","");
  8. define("DB_LOGIN","");
  9. define("DB_PASS","");
  10. ?>
复制代码


class.Database.php

  1. <?php
  2. /*
  3. 数据库操作类
  4. */
  5. class Database {
  6.         #private
  7.         var $mysqlLink;
  8.         var $dbName;
  9.         #public
  10.         function Datebase($host,$dbName,$dbLgoin,$dbPass) {
  11.                 $this->;mysqlLink=@mysql_connect($host,$dbLgoin,$dbPass);
  12.         }
  13.         function query($sql) {
  14.                 return @mysql_db_query($this->;mysqlLink,$sql,$this->;mysqlLink);
  15.         }
  16. }
  17. ?>
复制代码
:em11:

另外打听下,楼主class.page.php中的page类构造函数是干吗用的为和要老是从外部::它
作者: ashchen    时间: 2006-05-23 23:26
1 php是源代码解释运行,跟c++编译成2进制加载内存运行有很大差别
2 php的对象在运行完这次之后退出内存,所有的儿子,祖宗啊都烟消云散,下一次请求还要重新扫描,解释,加载,继承
3 php用在它适合的地方才能发挥它的优势
作者: fnet    时间: 2006-05-23 23:28
原帖由 ashchen 于 2006-5-23 23:26 发表
1 php是源代码解释运行,跟c++编译成2进制加载内存运行有很大差别
2 php的对象在运行完这次之后退出内存,所有的儿子,祖宗啊都烟消云散,下一次请求还要重新扫描,解释,加载,继承
3 php用在它适合的地方才能 ...

那你的意思php面向对象是鸡肋?

[ 本帖最后由 fnet 于 2006-5-26 15:30 编辑 ]
作者: goodoon    时间: 2006-05-26 15:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: fnet    时间: 2006-05-26 15:38
原帖由 goodoon 于 2006-5-26 15:29 发表
基本操作对象封装成OOP,商业逻辑还是用过程式的写法

流程逻辑很多也可以单独放在一个类里,只留一部分过程代码在外,正所谓单一入口。
也许我太偏激了,当然程序越快越好吧。
作者: fjytzh    时间: 2007-02-13 16:31
有框架确实方便点,就是自己做也会慢慢形成自己的框架
逻辑和表现分离有利于人员的分工合作,但是我觉得MVC在PHP中是不是真的那么重要呢?
多半爱用MVC都是从事过JAVA的,可能是习惯使然吧
作者: wwdwwd    时间: 2007-04-15 23:38
原帖由 tonera 于 2003-12-21 22:14 发表


没有绝对的对与错,讨论就是这样的,不是一定要讨论出胜负,而是封装大家的思想精华。这样目的就达到了。看来你这个人很执着啊。

正在搞一个稍大点的东西,觉得在涉及数据库的操作时,如果针对的表很少 ...

表多了用oop的效率会高吗?这两个好像是不相干吧?
作者: wwdwwd    时间: 2007-04-15 23:46
原帖由 hightman 于 2005-5-1 02:30 发表
哎,呵榀. 深夜逛到这里,看来看去...

力推OOP的都是觉得面向过程的编程方式主要缺陷在于:代码很难重用\可维护性差! 让他维护面向过程的程序代码他就喊着不如重写(试试看好了!)

以下说法均指在PHP中...:p

...

同感。也许是我没有开发过太大的项目吧,我这一两年开发的基本上都属于中小型的项目,我通常会把一些核心的,抽象的东西封装成类,其余的都是面向过程,我觉得维护起来也很方便,暂时还没有看到有什么不方便的地方。另外还有一个问题:什么样的项目才算是大项目?
作者: wangyun522    时间: 2007-04-18 10:50
我觉得OOP不OOP就看用在什么场合,关键是现在写出来的PHP程序太复杂,需要OOP来理顺,要不看着很烦。
作者: greattiny    时间: 2007-04-29 11:31
我正在学PHP,N楼上的朋友也说了。现在的PHP教程好多都是针对以前版本的,好多代码也是用以前版本写的。哪为仁兄能介绍点学习PHP5的网站或书籍........
大家说的OOP,我也学习过这方面的东东.我也是先学习的C,面向过程的.单说桌面应用程序,不过是WIN32还是linux下的,用C写的编译后,和C++写的编译后,我觉得产生的二进制都是顺序执行.虽然说有消息机制吧.那么,反汇编一下.看看面向对象的class具体是怎么实现的呢?面向过程的C又是怎么实现的.通过这个我觉得,面向过程的C写的代码在一定程度上比C++的执行效率高.其实用纯C也能实现面向对象.C++不就是带类的C么?我只是单从执行效率上说,C比C++快.但是,C++的面向对象应该非常有用.具体我也不说了,我理解的也不是很全面.
作者: jiang2798    时间: 2007-05-12 20:39
学习下 顶了!!!
作者: yehuo    时间: 2007-06-08 10:48
楼主的并不是OO代码,很臭啊。
作者: dujiangtao    时间: 2007-11-11 21:57
各有千秋,面向对象和面向过程的争论自一开始就没有停过。
作者: hmily36    时间: 2007-11-13 23:54
iamyess 说得还是有一定得道理,呵呵。
作者: oyd_admin    时间: 2007-11-14 12:49
OO无用
作者: oyd_admin    时间: 2007-11-14 12:55
其实从我这么多年来写代码/维护别人的代码的经验中来看,最好维护的代码不是OOP,也不是面向过程的,而是面向对象的代码。
你也可以理解成一种扁平的OOP,即它的主干是面向过程的,其复杂的分支采用OO进行封装。

就拿lz的例子来说,没事封装了一个Application对象,那纯粹是无病呻吟。时间一长了,你让接手的人去找个程序执行流程他都找不出来,谈何维护?
作者: SandersWang    时间: 2007-12-26 18:10
都封装成class不等于你就是oop了。


----------------------------

支持一下iamyess

批iamyess的人都有些强词夺理
作者: fnet    时间: 2007-12-26 18:37
这是典型MVC模式。
作者: 李某人    时间: 2008-03-19 21:06
好!!!
作者: angeljyt    时间: 2008-03-20 14:08
老大,你的代码和思想怎么和我写的好好相似呢。下面的仅仅是举个例子,不完整. 我自个儿写的一个MVC框架,可别说我是剽窃你的哦.
<?php
include_once($_SERVER['DOCUMENT_ROOT'].'/include/core.php');
include_once(CLASS_DIR.'/channel.class.php');
class ChannelPage extends Page
{
        function __construct()
        {
        }

        function input(){}
        function process()
        {
                global $db;
                $channel = new Channel($db);
                $this->channel = $channel->getAll(20);
                array_walk($this->channel, array($this, 'toUTF8'));
                $this->output();
        }

        function output()
        {
                $rs = new StdClass();
                $rs->root       = $this->channel;
                $rs->totalCount = count($this->channel);
                echo json_encode($rs);
        }

        function toUTF8(&$v, $k)
        {
                $v['html_title']=$v['name'] = iconv('gbk','utf-8', $v['name']);
        }
}

$page = new ChannelPage();
$page->process();
?>

[ 本帖最后由 angeljyt 于 2008-3-20 14:11 编辑 ]
作者: goshawk    时间: 2008-03-21 19:06

作者: xiaozhouzaici    时间: 2008-05-02 17:47
传递到page类中application对象,在page类中如何处理啊,能不能在详细点哦,有点搞不懂,

原谅我是个菜鸟
作者: xiaozhouzaici    时间: 2008-05-02 17:55
晕,我傻了,我看错了东西,没问题了
作者: wdg0802    时间: 2008-05-11 10:15
怎么说还是喜欢开源的东西。。一些东用着方便
作者: taoxuxiang    时间: 2008-11-11 13:57
标题: 三矿10个月节电设备节约电费64万元
今年1至10月,按照“节能、环保、计量”的工作思路,三矿从技术改造、规避高峰、推广新产品等方面人手节能降耗,
节电器节约电费64万元。
    大功率高耗能设备是技术改造的关键。今年以来,三矿对东西畛3.55m风机安装了稳压电源变频调速装置,使设备从直接启动改为三级软启动,减少了由于启动大设备增加需最电费;‘对神堂咀四台老式压风机全部更换为OIO-250/8型高效节能单螺杆压风机、减少和避免了系统故障的发生,节电设备提高了井下供风质量,并由原来开三台机减少为开两台,10个月节电设备节约电费28.9万余元;对井下设备进行了变频软启技术改造,在井下主运输皮带巷及峒底主皮带巷使用软启开关,加装变频软启开关,不仅降低启动电流,而且在运行中根据煤量大小,自动调整电压频率,减少空载损耗,使皮带运行更加经济平稳。
    在采取这些措施的基础上,三矿将用电指标层层分解到队组,并将电量、电费与产量挂钩考核,实行节奖超罚,并改变了井下生产队组设备管理模式,由采煤工区和掘开工区自行管理所用设备,杜绝了设备的空载运行。此外,他们充分利用电价政策,合理调整用电负荷,搞好避峰填谷、调荷节电工作,使生产和生活负荷错开,减少需量费和峰电费。该矿机电科三电办强化落实压风机集中供风、定时开机和主扇的择优运行制度,从基础管理上节约用电量。
    在不放过大处用电的同时,三矿更加注意了“细节”之处的用电。他们积极推广绿色照明节电照明节电单个功率虽然不大,但它应用面广、数量多。以前,该矿工业厂区照明用电为250w、500w白炽灯及2000w射灯,月用电量12.25万度,年用电量达147万度。今年以来;他们对全矿工业厂区、办公楼照明进行了照明节电,将以往的大功率白炽灯更换为小功率节能灯,陆续在全矿地面各单位车间厂房、办公楼安装了 5w到85w的路灯节电器,节约电量15万度,节约电费5.5万元。
作者: taoxuxiang    时间: 2008-11-11 13:58
标题: 节电器节电降耗 省城零售业变“绿”
对30家企业推广使用节电器节电办法 塑料袋的使用率比去年同期降低40%

开应急灯照明节电打扫卖场、设巡查员管理空调温度、霓虹灯也不再追求彻夜通明而是用照明节电的方法。去年6月,国家商务部将太原市列为全国开展“零售业节能行动”的10个试点城市之一。如今,一年多时间过去,省城零售业逐渐穿上“绿色外衣”。
18日,太原市商务局商务改革处张处长介绍,“零售业节能行动”开始后,省城商场、超市在节电器“节电”方面各有招术。例如:柳巷一家去年商场投入180万元安装了智能照明节电器,全部使用电子镇流器和节能灯具,一年节约开支370000元,节电率达到20%以上。有的商场公共通道原本设计安装两个照明灯,为了节约用电只装了一个。
张处长介绍,2007年,省、市财政共安排了700余万元,用于省城零售业的节能降耗工作。在用电上,先后对30家商业零售业推广使用符合商业企业实际情况的集中控制办法,安装了稳压电源
路灯节电器
节电设备,每天根据日照时间的变化开启,定时关闭。
随着商业零售企业的增多,节电器节能潜力巨大。今后,太原市商务局将通过引进先进技术、推广先进经验,大力引导商业企业使用稳压电源
路灯节电器
节电设备加大对水、电、气、风等设备的节能改造,到2010年,力争实现零售业万元营业额能耗降低20%。为确保实现这一目标,太原市商务局也呼吁企业:制止过多过滥使用塑料包装的现象,推广纸质、布质包装,减少一次性用品,推广可再生、可循环利用产品。
作者: mz198424    时间: 2008-11-11 15:08
标题: 回复 #10 shukebeita 的帖子
强悍,感谢。
作者: qai41    时间: 2009-01-10 20:03
喜欢这lz说的.
作者: cfrs2005    时间: 2009-05-20 14:48
mvc 理解容易点 上手快  oop.........oh s***t 为什么老要实现一个入口呢!!! 难道就因为他是一个网站是一个实例么??
其次实现的方法都这么虚伪 还不如直接 过程式算了 !!如果说维护上面难  分层么 所有的 curd 操作  逻辑操作分层 !!
作者: ws00377531    时间: 2009-05-20 16:18
这么老的帖子 也有人翻出来
作者: hipeace86    时间: 2009-06-07 15:35
我刚接触PHP以产是做.net
自己也试着写了下OOP,感觉还行
作者: lbj    时间: 2009-06-30 00:02
按照楼主的方式,要产生多少文件啊,我看过一些框架通常采用controller和action的方式,controller是一个类而action是类中的方法,比如对一个用户的操作全部放到一个类中,这样可以大大减少文件的数量。而且面向过程方式同样可以实现相同的功能及结构,我认为php最为人诟病的地方就是混乱的命名方式,采用面向过程方式开发,程序越大越充满陷阱而且代码风格总是被php的函数所破坏,这是php先天设计上的缺憾,

[ 本帖最后由 lbj 于 2009-6-30 00:14 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2