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的思想很自然的就進入我的腳本里了并沒有感到什么障礙,反而覺得輕松和愉快?,F在回頭看看那些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寄的一期??杏衅L談說道了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寄的一期??杏衅L談說道了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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97