OOP的PHP长啥样

发表于:2007-05-25来源:作者:点击数: 标签:php长啥样OOP
在PHP的论坛中总是听到有人对PHP的OOP支持说三道四的,说这有 缺陷 ,那里不足,但是都拿不出实际的例子。原来说过要和大家说说这事,但是一直很忙,现在算是抽了些时间了,所以把我刚刚做过的一个项目的框架拿出来和大家探讨一下。这个项目99%的代码是用oop

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

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

首先从我的第一个文件index.php 开始介绍吧。我的index.php文件是这样的:
[code:1:72b4c88a28]
<?php
include_once ('config.php');
include_once ('class.Application.php');
$app = & new Application();
$app->run();
?>
[/code:1:72b4c88a28]
这个就是全部了,虽然只有4行,但是如果用OOP的方式写这个应该就够了吧。
有一点经验的哥们会发现这里只用到了一个Application 对象,那么一定很想知道这个对象究竟长什么样呢?我们继续看看class.Application.php 这个文件的内部。从以上的代码中我们知道她应该至少包含两个方法
Application()

run()
所以大体上应该长成这样
[code:1:72b4c88a28]
<?php

class Application
{
function Application()
{

}

function run()
{

}
}

?>
[/code:1:72b4c88a28]
现在就算知道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
[code:1:72b4c88a28]
<?php

class Page
{
function Page()
{

}

function show()
{
//不能直接调用这个方法一定要在子类中去具体实现。
die('You can not use this funciton directly from Page class');
}
}
?>
[/code:1:72b4c88a28]
其中这个show方法应该是所有页面对象都具有的方法,只是在实现上有所不同。

class.HelloPage.php
[code:1:72b4c88a28]
<?php
require_once ("class.Page.php");

class HelloPage extends Page
{
function HelloPage()
{
parent::Page();
}

function show()
{
echo "Hello, I can say OOP in PHP world!"; 
}
}
?>
[/code:1:72b4c88a28]

class.DatabasePage.php
[code:1:72b4c88a28]
<?php
require_once ("class.Page.php");

class DatabasePage extends Page
{
function DatabasePage()
{
parent::Page();
}

function show()
{
//做一些数据库操作然后将结果显示出来。
}
}
?>
[/code:1:72b4c88a28]

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

class Application
{
function Application()
{

}

function getAction()
{

}

function run()
{
$pageClass = $this->getAction();
include_once ("class.".$pageClass.".php");
$page = & new $pageClass();
$page->show();
}
}

?>
[/code:1:72b4c88a28]
为什么getAction()空着?因为它太简单了,你自己可以轻松地把它写出来呀。

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

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

[code:1:72b4c88a28]
<?php
require_once ("class.Database.php");

class Application
{
var $db;//数据库对象

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

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

funciton & getDatabase()
{
return $this->db;
}

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

?>
[/code:1:72b4c88a28]
你现在不用太关心这个 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
[code:1:72b4c88a28]
<?php
require_once ("class.Page.php");

class DatabasePage extends Page
{
var $db;

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

function show()
{
$sql = 'SELECT * FROM sale_orders';//简单的一个 SQL 例子。
$results = $this->db->query($sql);//query 是 Database对象的一个公共的方法,通过它向数据库提交SQL查询。
...;//做一些操作把得到的结果显示出来。
}
}
?>
[/code:1:72b4c88a28]
好了,一个半的功能算是完成了,PHP对于OOP支持得也很漂亮吧,结构清晰,维护方便,至于效率嘛,我可没看出来有什么损失,如果你有兴趣可以自己测试一下。用这样的框架可以轻松应对各种需求的变化:增加各种权限控制,分离数据库层,商业逻辑,和表象层,增加远程调用接口统统不成问题,只是这里实在写不完这么多的东西。真不知道谁还会有理由说PHP 中OOP 很烂呢?

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

 mikespook 回复于:2003-12-17 12:03:44
其实我一直在想~~能不能模仿ASP.NET那样~~~

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

说白了就是学SERVLET和ASP.NET的那套~~~

 NightKids 回复于:2003-12-17 13:20:35
php5 的 class 样式
[code:1:273390452c]
class TClassName{
    private $_PrevateVar="hahah";
    protected $_ProtectedVar="hehehehe";
  
   function __construct(){
    //真正的构造函数
   }

   function __destruct() {
       //真正的释购函数
   }

   

    private function privateFunction(){
         try{
           //抛出异常
           throw new MyExceptionFoo('Hello');
        }catch(MyException $exception) {
          //...............
        }
   }

   public function publicFunction(){
          
   }
}

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

}

$obj = $obj->__clone(); //对象的克隆
... 很多
[/code:1:273390452c]

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

以前常用的类似

return sprintf("aaaaa"); 
这样的写法在 php5 是严重错误,只能这样
$r = sprintf("fasdfasdf");
return $r;

 geel 回复于:2003-12-17 16:11:54
有些时候用类麻烦一点。

但是看看新办主任的php5类,感觉越来越像c++了,呵呵,高兴啊。

 lilyzyp 回复于:2003-12-17 16:23:52
OOP的东东 我也是刚学
觉得PHP越来越向C++靠拢了 
支持PHP  支持面向对象

 iamyess 回复于:2003-12-17 17:08:43
说我吗? 我可一直都没说这观点哦

 shukebeita 回复于:2003-12-17 21:45:06
[quote:d99ff903a1="mikespook"]其实我一直在想~~能不能模仿ASP.NET那样~~~

比如表格,我们可以设计一个表格的类~~~文本框我们可以生成文本框的类~~然后设计一种方式触发事件~~~就像ASP.NET的客户端控件那样~~
如果能设计出完整的PHP的类,那么..........[/quote:d99ff903a1]
我不太懂ASP .net的东西,但是你可以看看这个是不是你希望的,或者可以在这个库的基础上改进成你所希望的呢?
http://phphtmllib.newsblob.com/

[quote:d99ff903a1="iamyess "]说我吗? 我可一直都没说这观点哦...[/quote:d99ff903a1]呵呵~~,你又回来啦。这个贴子只是我的一些经验的总结,没有针对什么人的目的。就事论事,欢迎讨论!

 iamyess 回复于:2003-12-17 21:54:14
不好意思,我又来砸场子

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

但是,但是:

你上面说的 

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

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

new class 不等于就是  oop

 夜猫子 回复于:2003-12-17 22:41:09
想请问iamyess,你心里的OO是什么样子,老实说对OO的误解是如此之多,连我都无法肯定我心中的OO到底是不是真正的OO,愿意看看你的理论以印证之。

 shukebeita 回复于:2003-12-18 00:19:16
[quote:515760ca9d="iamyess"]不好意思,我又来砸场子

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

但是,但是:

你上面说的 

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

有什么实际关系呢?也就是说 这个例子能说明?..........[/quote:515760ca9d]

Hi! boy, I'm really glad to offer something that you can hit on.

Over times of try and trial I learnt that the OOP, more aclearcase/" target="_blank" >ccurately it should be OOD and OOP, is a way to see and express in programming world, not just words like "class","public" or "private". If you are really focusing on those words, surely you will miss my points.

 I never said OOP is better than procedural coding. That is your assumption but not what I meant to proof. Actually, the whole thing all depends on people and their minds. Why I say the support of OOP in PHP is good and you can see from this sample is that PHP offers you everything you need to smoothly express your ideas in OOP way.

Maybe someone doesn't have a chance to see or experience good OOP codes working in real world, so they become very disappointted or even mad at any OOP ideas or words. I'm sorry for that. And that is another purpose of my post which is to encourage people to learn OOP with their favourite programming language PHP. It is possible and not so hard. 

This reply takes me 20 minutes to finish, because I think my hard working post need addtional comments to make it easily understood. 

Role play is really fun, you like being a headless fly bouncing arround, I like being a hunter aiming an shooting everything in my range. So don't stop, just moving in your style and hope you really enjoy your life.

别担心中文的翻译在这里:
[quote:515760ca9d]
嗨!伙计,我很高兴能够拿出一些东西让你来砸。
从过去的多次尝试和教训中我理解到OOP,更准确地说是OOD和OOP,是一个在编程世界里观察和表达的方法,而不是诸如“class”,“public”,“private”之类的关键词。如果你的注意力在这些词上面,你肯定就误会我的意思了。

我从来没有说过面向对象一定比过程式的程序好。那些只是你的假设而不是我想要证明的。实际上这些事情全看人和他们的心智。为什么我说PHP中对于OOP支持的很好是因为你可以从例子中看到PHP为你提供了所有的东西,使你能够流畅地用OOP的方式来表达你的思想。

也许有些人没有机会在现实中看到或体会到好的OOP代码,所以对于OOP非常失望甚至对于OOP的任何想法和词汇都很抓狂。对此我只能说声遗憾。当然这也是我发这个贴子的另外个意图,这就是鼓励大家用他们喜欢的语言PHP来学习面向对象的编程方法。这是有可能的而且不很难。

我花了20分钟回这个贴子,因为我认为我花力气写的东西需要多一些解释来使更多的人更容易理解它才好。

角色扮演的确很有乐趣...呵呵~~[/quote:515760ca9d][/quote]

 longnetpro 回复于:2003-12-18 06:01:37
楼上的那段英文说得不错。其实iamyess有点钻了牛角尖。这个讨论并没有涉及到哪个更好,而只是大家自己在心中感觉PHP的OOP到底怎么样,并没有一个所谓权威的说法,也并没有必要。每个人的想法并不完全一样,理解程度和层次也不完全一样,对一些大家都说不清楚的东西,没有必要一定要某人讲清楚以证明他的所谓正确性,大家也只是在讨论嘛,并不一定非要得出什么结论不可,只要大家都学到一点东西就可以了。不过这次iamyess不错,没有再犯上次的毛病,讨论嘛,大家都欢迎,针锋相对也是难免的,只是不要太出格就可以了。不过这位兄弟如果先前只是想把自己炒火一点的话,那还真有点商业素质了 :) 开个玩笑。

 mikespook 回复于:2003-12-18 12:35:26
[quote:101610eb10="shukebeita"]我不太懂ASP .net的东西,但是你可以看看这个是不是你希望的,或者可以在这个库的基础上改进成你所希望的呢? 
http://phphtmllib.newsblob.com/ [/quote:101610eb10]

哈哈,就是这种东西~~~我仔细看看~~~

 mikespook 回复于:2003-12-18 12:37:25
[quote:2ad87f94f7="iamyess"]不好意思,我又来砸场子

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

但是,但是:

你上面说的 

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

有什么实际关系呢?也就是说 这个例子能说明?.........[/quote:2ad87f94f7]

我不是很明白你要表达的意思~~~对OO支持好和对过程支持好并不矛盾啊~~~
好比C++不论是面向过程还是面向对象,都是利器么。

 NightKids 回复于:2003-12-18 15:53:57
无论用什么,只有做技术的才关注,最终是要看结果,否则没饭吃。

 iamyess 回复于:2003-12-18 15:55:59
哦,不不不

我不是想钻牛角尖

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

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

我不是要打击大家的积极性啊,我也不是要老要当坏人,当有些问题是必须理清楚的,这也是为大家好,不然大家用了 class ,但依然用 非 oo 思想写东西,那...

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

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

 shukebeita 回复于:2003-12-18 19:13:38
[quote:88af52392f="iamyess"]
只是想问一个问题,oop 不是开发效率高,维护好吗? 那这段代码阐述了 比过程优越的哪个方面呢?
[/quote:88af52392f]
要不我看这样,玩一点有意思的,例子里面我已经有了两个功能。接下来可以让斑竹或者大家出些题目来扩充那个简单的例子,比如增加权限控制,远程调用,短信接口,数据库移植等等。每周一轮一个题目,我们各自来试着完成这个题目,然后把代码发出来试一试看一看。大家可以献计献策,可以找高人帮忙,可以使用各种现成的php软件包,可以抄袭剽窃。只有两个规则

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

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

3,5轮以后来个总评,大家投票,发表感想,优势如何,效率如何,你看如何?

 longnetpro 回复于:2003-12-18 20:08:43
那我经常是两者结合,怎么办?

 iamyess 回复于:2003-12-20 14:55:15
[quote:7d5dc9a4e2="shukebeita"]
要不我看这样,玩一点有意思的,例子里面我已经有了两个功能。接下来可以让斑竹或者大家出些题目来扩充那个简单的例子,比如增加权限控制,远程调用,短信接口,数据库移植等等。每周一轮一个题目,我们各自来试着?.........[/quote:7d5dc9a4e2]

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

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

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

我劝各位初学者不用急着学 oo ,那只是形式,掌握里面的东西才是重要的,所以要狂比较和思考先,不然就挂羊头卖狗肉了

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

我又无语了~~~

 shukebeita 回复于:2003-12-20 19:03:07
[quote:659de0b8f8="iamyess"]
不过要没大型的东西在开发过程做比较还真难说明,这一问题不为难你了
[/quote:659de0b8f8]
其实也不是什么真的要命的东西,就是比较费时间,耽误挣钱。不玩就不玩了,我也害怕玩物丧志的。:lol:  其实题目小一些也是可以的。只要动起来就能比较出来这个和参禅悟道一样一滴水,一片云足以,何需轰轰烈烈,生离死别呢?


[quote:659de0b8f8="iamyess"]
我劝各位初学者不用急着学 oo ,那只是形式,掌握里面的东西才是重要的,所以?..........[/quote:659de0b8f8]
为什么不呢? 不但要急着学,还要从一开始就学。还是我那句话,OOP是在编程世界里观察和表达思想的工具。它就像现实世界里的语言一样使用来观察和表达思想的工具。这就象学习英语,是从小学容易掌握呢?还是30岁以后再学比较容易掌握? 

我觉得关键是现实的php中没有一个好的OOP学习环境,缺乏好的OOP的范例,样本,教程。所以让人有些疑惑和害怕了。

 longnetpro 回复于:2003-12-21 02:05:09
里面的东西的掌握也是先从外面开始的。为什么要力劝大家不学OOP呢?好的东西要鼓励大家去学,不但只学形式,还要学内涵,否则,偏废任一个都达不到好的效果。

 anson_x 回复于:2003-12-21 11:30:37
总的感觉来说,还是觉得过程的比较难维护,OO的比较好些

 iamyess 回复于:2003-12-21 13:13:38
不不

你都不说过

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

要真正领悟才是正路

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

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

当然,如果能直接领悟 oo 思想那我也就认了

 tonera 回复于:2003-12-21 13:54:57
过程和oop的利弊,就像和尚头上的虱子,明摆着嘛。关键是看实际需要啰。

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

相反,如果只是计算1+1=2,也用OOP来搞,就很没道理了。

 iamyess 回复于:2003-12-21 17:12:52
是我表达的不清楚吗?怎么回答的都不对题啊

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

 mikespook 回复于:2003-12-21 21:01:43
[quote:0aa925659b="iamyess"]不不

你都不说过

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

要真正领悟才是正路

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

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

当..........[/quote:0aa925659b]
不觉得从过程学起和从面向对象学起有什么特别的不同~~~
而且我觉得在理解能力有限的情况先先从面向过程学起,反而会影响面向对象的学习。弄得不论不类~~

 tonera 回复于:2003-12-21 22:14:33
[quote:09aae7e66c="iamyess"]是我表达的不清楚吗?怎么回答的都不对题啊

错的是我~~~~~~~~~~~[/quote:09aae7e66c]

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

正在搞一个稍大点的东西,觉得在涉及数据库的操作时,如果针对的表很少,只用函数效率高一些。如果同时操作的表很多,(例如三个以上)使用OOP的方式是很好的方法。我只用写一个基类,几个派生类就OK了。继续中...

 网络混混 回复于:2004-01-09 06:24:05
[quote:7b027259f8="shukebeita"]
要不我看这样,玩一点有意思的,例子里面我已经有了两个功能。接下来可以让斑竹或者大家出些题目来扩充那个简单的例子,比如增加权限控制,远程调用,短信接口,数据库移植等等。每周一轮一个题目,我们各自来试着?.........[/quote:7b027259f8]


强烈支持

 网络混混 回复于:2004-01-09 06:28:30
OOP不OOP关键在于思想,不在于形式;

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

用OOP写,没有OOP思想的代码会写成过程式的!

 longnetpro 回复于:2004-01-09 12:04:06
楼上说得对。不说别的PHP的函数大多数都是有OO的思想在里面的,比如说mysql系列函数,其实改造成一个OO很容易,里面的资源ID其实就是对象的指针表达方式而已,殊途同归。只是过程在重用性方面不如OO的灵活。

 NightKids 回复于:2004-01-09 22:15:41
既然提到题目,我就提出一个:

就写一个像 CU 的站内短信吧,大家来评一下用什么方式做的好维护。
维护包括功能的增减,页面显示的修改等。

 lem 回复于:2004-01-12 21:33:09
[quote:55caf99934="shukebeita"]好了,一个半的功能算是完成了,PHP对于OOP支持得也很漂亮吧,结构清晰,维护方便,至于效率嘛,我可没看出来有什么损失,如果你有兴趣可以自己测试一下。用这样的框架可以轻松应对各种需求的变化:增加各种权限控制..........[/quote:55caf99934]

推荐 PHPMVC 框架,很好。

 odin_free 回复于:2004-01-13 10:03:49
[quote:e1bbf4fb37="iamyess"]
我不是要鼓励大家偏学哪一样哦,我是劝大家从过程开始

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

当..........[/quote:e1bbf4fb37]

其实没必要 虽然我是这么学的

 hongweig 回复于:2004-02-24 09:31:25
感谢楼主的帖子。

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

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

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

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

php非常不错。也非常好。

 shukebeita 回复于:2004-02-24 10:23:47
[quote:c71d08ac46="hongweig"]
我没有看完整个帖子,
[/quote:c71d08ac46]

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

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

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

这一篇自认为是最有价值的一贴了,可能过长了很少有人能看完。倒是那个近似于八卦的利器一箩筐之类的东西被人转来转去的,的确有些费解。  :em23:

 longnetpro 回复于:2004-02-24 10:29:08
楼上总体上说得不错,不过“初学者如果连过程式的编程方法都无法理解,那么对于oop怕更是一愁莫展了”这句话其实是有很大的问题的。只不过因为一般我们从头学都是学习面向过程的编程思维,而后才学OO,所以才觉得OO比较难学,其实从来都是觉得先接触的东西简单。在很多情况下并不是这样的。就象小孩子学说话,谁都知道汉语在世界上比英语难学,但小孩从小就学汉语,大了才学英语,因此还是有很多人都认为英语比汉语难学也是一样的道理。

其实OO思维是与生具来的,与物质本性有关的,比较具体的东西。之所以很多人认为OO抽象难学,其实是教育方式与方法的问题。如果有适当的教材,适当的方法,如果大学生从入学起什么都不知道的时候就开始培养OO思维,几年下来谁一定会说面向过程的一定比面向对象的简单?!说不定那时候人们会认为用OO是自然而然的事。而以后还可能会出现更高级的东西,人们根本不必用什么对象,过程,只需要随口说两句话,一个软件就生成了,那时大多数普通程序员还需要学什么过程吗?就象现在大多数搞高级应用的程序员都不学汇编了——虽然它一样是很重要的。并不是说哪个好哪个不好,只是说道理是一样的。

以上的一些想法其实是典型的思维定式!永远应该走在技术的前沿。

 longnetpro 回复于:2004-02-24 10:32:16
哈,原来SHUKEBEITA在我回帖的时候也在回帖啊。连发帖时间都几乎一样!

结果上一篇中应该是:“楼上”=“楼上的楼上”=hongweig

看来真是所见略同,几乎观点一模一样,例子也是大同小异!!真是幸会幸会!!

 hongweig 回复于:2004-03-03 08:48:10
我也不知道,我也许是接触编程的时候,97年左右,那个时候还没有oop理论很兴盛,所以考虑问题是站在机器的角度,学会如何使用机器的思维来说话,所对于oop来说很长一段时间是比较难以理解的。

呵呵,我说没有看整个帖子,是没有看完所有的讨论,顶楼的贴子我可是看了好几遍。
今天又再次重看。呵呵。

 hongweig 回复于:2004-03-03 08:57:58
shukebeita, longnetpro  呵呵,我也不是计算机科班出身的。

自学之难深有体会。

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

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

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

不说别的,你让一位计算机系的学生去读《java编程思想》这本书,看看有多少人能够很好的接受?

 shukebeita 回复于:2004-03-03 10:13:16
[quote:2d79f18cf6="hongweig"]而只到这些年才真正的兴盛起来,这说明oop中还是存在着很多问题[/quote:2d79f18cf6]

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

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

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

[code:1:2d79f18cf6]自称是完全的oop?连java不敢不这么说啊。[/code:1:2d79f18cf6]
据说有一种叫smalltalk的东西自称是完全的oop,有机会你可以试一试,免费的呦。
其实OOP完全是思想和语言没有大关系。所以也就不存在什么完全OOP的语言了。

 hongweig 回复于:2004-03-03 12:20:53
smalltalk是一种很古老的语言,java的oop大多是借用它的。这种语言应用并不广。

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

而并非php.

 dualface 回复于:2004-03-04 00:55:30
为什么要OO?
因为机器快了;软件大了;一个人搞不定了;维护花的钱多了。。。。。

 hongweig 回复于:2004-03-04 09:05:11
[quote:0a60f21a9a]
为什么要OO?
因为机器快了;软件大了;一个人搞不定了;维护花的钱多了。。。。。

[/quote:0a60f21a9a]

哈哈,楼上一言中的。

确是是这样。
不过,应该是人力成本过高才对哦。
一个人能力太有限。

 sports98 回复于:2004-03-16 18:45:00
取其精华,弃其糟粕

批评与自我批评相结合

 yinhm 回复于:2004-04-05 16:48:04
[quote:f70581f6b3="dualface"]为什么要OO?
因为机器快了;软件大了;一个人搞不定了;维护花的钱多了。。。。。[/quote:f70581f6b3]

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

 heiyeluren 回复于:2005-04-30 16:27:48
我理解OO是C++
哈哈!!

 hightman 回复于:2005-05-01 02:30:21
哎,呵榀. 深夜逛到这里,看来看去... 

力推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:26
我觉得PHP这东西(4.x)还是过程式舒服,当然编程中你会发现有些过程差不多,不停的重复,却又不是一个函数可以抽象的时候,就可以用类来封装了。不抽象的东西也用类封装怎么感觉都不舒服,以前看过xoops的代码中关于多国语言支持的部分...

似乎也就把一些翻译,塞到一个类里,整类就一个函数的样子,感觉很不好。

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

 ttvast 回复于:2005-05-03 15:35:21
[quote:c86355402c="yinhm"]

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

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

 imbiss 回复于:2005-05-03 17:22:29
[quote:e66c9b01eb="ttvast"]

不过,编程序的人都知道,没有错误的程序是不存在的. [/quote:e66c9b01eb]
TeX 的祖师爷的一美元奖金的故事知道吗?

 liumingl 回复于:2005-05-09 15:05:03
长知识!

 云飞月 回复于:2005-05-10 21:16:02
大大们都好厉害

原文转自:http://www.ltesting.net