⑴ 我一直覺得php不適合oop,不知道各位怎麼看
沒做過大型的j2ee開發,不過jsp我以前用過一陣.
從理論上來說,jsp+java bean的確有點像php+smarty.
其實我覺得php跟jsp的根本差別是,php本屬解釋性語言,java屬於編譯型語言.這才是最根本的區別.至於java的那一套ejb之類的.php一樣可以模擬.
但是加上zend,php這一點就可以跟jsp差不多了.
理論上都說jsp的效率高,可實際看一些大型項目,jsp的效率根本沒想像的那麼好.
⑵ 怎麼才能學好PHP面向對象OOP
面向對象是什麼?你可以說出這個答案嗎(相信沒有正確答案)?我覺得面向對象只是軟體工程中的一種工具而已。那軟體工程的目的是什麼?目的是編寫出可靠、高效、靈活、易擴展、可復用的軟體產品。既然面向對象是軟體工程當中的一種工具,那我們使用面向對象的目的也應該是這些。就是說我們用面向對象的目的是編寫出可靠、高效、靈活、易擴展、可復用的軟體產品。我們一定要以這個目的為中心來學習和使用面向對象,不然你會失去方向。大多時候講面向對象,多是講面向對象本身,而不講怎麼利用面向對象去解決實際的問題,這樣很容易誤導初學者。再加上華麗的文字,很多人覺得只要面向對象了,什麼事都可以OK了。舉個例子,給你一把最好的槍,教你如何使用它,過了一段時間你對這把槍了如指掌。現在讓你去打靶,結果100發子彈,一發都沒有打中。咦,我不是用了最好的槍了嗎?為什麼一發都打不中?因為你不知道射擊要領,不知道如何瞄準靶心,結果當然可想而知了。我們要OOP(Object-Oriented Programming),不要POO(Programming Object-Oriented)。 面向對象有3大特徵(一般講面向對象都會提到這三個),繼承、封裝、多態。按字面上理解,對我們來說是全新的概念,但只要你分析一下,就會發現這些都是我們在編程中,常常用到的概念。 封裝是什麼?只有在面向對象里才有封裝的概念嗎?不是的,只要是程序就有封裝。大家常常用的變數、函數就是封裝。舉個例子,你寫了取用戶狀態的函數,對調用這個函數的程序來說,取用戶狀態邏輯是封閉的,所以邏輯發生變化時,不會對調用的程序造成影響。變數也是封裝,你定義了一個int變數,無論你給它賦什麼值,對調用這個變數的程序來說,就是一個整數型類型的值。提到封裝不得不提介面,因為封裝是做介面的過程。介面是什麼?只有用了interface這個關鍵字才是介面嗎?詞典里的解釋是物體的接觸面、界面。世界是由物體組成的,所以我們的生活當中到處是介面。你看到一個球,它是圓的,圓就是介面。我們的程序也都是由介面組成的,數據類型、關鍵字、函數、變數等等。比如說看到int這個詞,你就知道它是整數型數據類型,我們可以說:int是整數型數據類型的介面。所以封裝和介面不是面向對象特有的概念,只不過在面向對象里它們的范圍擴大了而已。我們在網上常常能看到面向對象和面向過程之間的討論,說哪一個好。其實,這些都是不重要的,因為用哪一個方法,都是做介面的過程。關鍵在於使用這些方法的程序員,看你的抽象能力怎麼樣了。 多態可能是我們最難理解的一個概念,polymorphism這個詞,因為大家沒有學習過面向對象的話,是很難碰到的。其實這個也是我們常常用到的一個概念,只不過沒有給它命名而已(至少沒用多態來命名它)。看下面的例子, double a = 0,b=5,c=0; a = 1; c = a + b; cout << c << endl; a = 3.5f; c = a + b; cout << c endl; 輸出結果是 6 8.5 我們先定義了三個變數,a、b、c,先後給A賦值1,3.5,然後輸出a+b的結果,可以看到,同樣的邏輯隨著a值的變化,輸出的結果也是不一樣的(多態的效果)。在這里double是高類型(相當於父類),1、3.5(int,float)是低類型(相當於子類)。這個例子是變數的多態,那有沒有函數多態的例子,當然有,寫過C的人都知道函數指針,它就是函數的多態。 終於要說說對象了,重點就在這里~ 第一,類是一個模塊。以前我們的模塊是一個文件,比如一個.c、.cpp等等。一個模塊文件里寫什麼功能函數沒有限制(理論上沒有明確定義該怎麼寫),按開發人員的經驗來部署這些功能函數。所以很容易寫出超級模塊(一個文件里有幾十個、幾百個函數),代碼維護起來很不方便。面向對象就很好的解決了這個問題,只要看過面向對象基礎理論的程序員都知道,先定義類,然後把相關的函數放到類里。面向對象里有一個原則,類單一職責原則,遵循這個原則的話,你可以寫出很好的模塊出來。更重要的是我們溝通維護起來也很方便,比如以前溝通可能是這樣的,修改customer.cpp文件里的某一個函數,面向對象里呢,可以這樣說修改客戶類的某一個方法。這個非常重要,因為這個跟人的思維有密切關系。比如我們到餐廳去吃飯,你對服務員說我要一瓶啤酒,我確信服務員會再問你一句:先生,你要什麼牌子的啤酒?但如果你說:我要一瓶百威啤酒,服務員肯定不會再問你。要是把一個系統看成生產線的話,類就是工人。一個工人只負責一個操作,A負責打孔,B負責裝螺絲釘,C負責包裝。這樣做非常有效率,而且出了問題,很好確定問題出現在哪個工人。第二,類是一個自定義數據類型。理解了這點,你的思路會清晰起來,也不會對面向對象感到陌生。看下面的簡單例子, //計算兩個數的合 double sum(double a,double b); int _tmain(int argc, _TCHAR* argv[]) { double a=0,b=0; a = 1; b = 2; cout << sum(a,b) << endl; a = 1.2f; b = 2.3f; cout << sum(a,b) << endl; return 0; } //計算兩個數的合 double sum(double a,double b) { return a+b; } 例子里,低類型的int和float賦值給了高類型的double,然後用sum函數它們的合。如果編程語言不支持這種轉換的話,我們只好寫兩個函數了, //處理int的計算 int sum(int a,int b); //處理float的計算 float sum(float a,float b); 所以我們可以確定-同類型當中,只有提供從低到高類型的轉換,才可以實現多態的效果(不知道,沒有面向對象以前是什麼概念)。當然,類作為數據類型,也需要這種轉換了。但類是自定義類型,所以,哪個是高類型,哪個是低類型,必須要由我們來定義:父類是高類型、子類是低類型(繼承是這么誕生的嗎:))。繼承讓我們可以復用父類的代碼,但在這個例子中我們可以看出,它的主要目的是在多態。 上面我們討論了面向對象和它的三個特徵,我們可以看到,這些都是編程當中常常用到的概念。我覺得最大的突破是給我們提供了新的思維模式、新的代碼組織結構、定義了以前軟體設計中比較模糊的概念(比如多態)。那我們怎麼轉換我們的思維呢?把你想像成公司的經理就可以了。你現在是一家公司的經理了,部門就是子系統,員工就是對象。你需要做的就是這些, -每天會有很多事需要你處理,做好心裡准備。 -公司做什麼業務? -要建立幾個部門?,規定部門之間的溝通規則。 -需要什麼樣的職位?每個職位要做的事是什麼? -規定業務流程,業務流程中,需要哪個部門參與?需要哪個員工參與?他們之間怎麼溝通? -借鑒成功的管理模式,但要符合公司的情況,不要盲目地使用,因為代價太大了。 -不要設置太多的溝通環節,能簡單就簡單,只要完成目標就可以。 -准備應對變化。世界上沒有對於錯,永遠是前進中不斷修正。 就這些啦?恩,道理很簡單,但要做一個好公司就非常困難了,因為變數太大了。面向對象也是一樣的,需要付出努力,才可以做好。
⑶ 急需php oop綜合項目切合網站建設的示常式序
給你推介一個世界排名第一的網站模板品牌----TemplateMonster(怪獸模板),中文官網也已建成,設計確實非常漂亮,選擇的餘地也很大,總共有30000款供你挑選。最後選定,購買模板之後,好像他們還提供模板修改,從而製作出網站
⑷ 下面的PHP的OOP代碼哪裡錯了呀
classSpider{
var$host,$file,$port;
function__construct($host,$file,$res){
$this->host=$host;$this->file=$file;
}
functionfpconn(){
$fp=fsockopen($this->host,$this->port,$errno,$errstr,30);
if(!$fp){die("連接失敗$errno-$errstr");}
return$fp;
}
}
⑸ php oop的作用
oop是面向對象編程(設計) 面向對象程序設計(英語:Object Oriented Programming,縮寫:OOP),指一種程序設計范型,同時也是一種程序開發的方法論。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟體的重用性、靈活性和擴展性。基本理論
一項由 Deborah J. Armstrong 進行的長達40年之久的計算機著作調查顯示出了一系列面向對象程序設計的基本理論。它們是:
類
類(Class)定義了一件事物的抽象特點。通常來說,類定義了事物的屬性和它可以做到的(它的行為)。舉例來說,"狗"這個類會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類可以為程序提供模版和結構。一個類的方法和屬性被稱為"成員"。 我們來看一段偽代碼:
類狗 開始 私有成員: 孕育 毛皮顏色 公有成員: 吠叫() 結束
在這串代碼中,我們聲明了一個類,這個類具有一些狗的基本特徵。關於公有成員和私有成員,請參見下面的繼承性一節。
對象
對象(Object)是類的實例。例如,"狗"這個類列舉狗的特點,從而使這個類定義了世界上所有的狗。而萊絲這個對象則是一條具體的狗,它的屬性也是具體的。狗有皮毛顏色,而萊絲的皮毛顏色是棕白色的。因此,萊絲就是狗這個類的一個實例。一個具體對象屬性的值被稱作它的"狀態"。
假設我們已經在上面定義了狗這個類,我們就可以用這個類來定義對象:
定義萊絲是狗 萊絲.毛皮顏色:=棕白色 萊絲.吠叫()
我們無法讓狗這個類去吠叫,但是我們可以讓對象"萊絲"去吠叫,正如狗可以吠叫,但沒有具體的狗就無法吠叫。
方法
方法(Method)是一個類能做的事情,但方法並沒有去做這件事。作為一條狗,萊絲是會吠叫的,因此"吠叫()"就是它的一個方法。與此同時,它可能還會有其它方法,例如"坐下()",或者"吃()"。 對一個具體對象的方法進行調用並不影響其它對象,正如所有的狗都會叫,但是你讓一條狗叫不代表所有的狗都叫。 如下例:
定義萊絲是狗 定義泰爾是狗 萊絲.吠叫()
則泰爾是不會吠叫的,因為這里的吠叫只是對對象"萊絲"進行的。
消息傳遞機制
一個對象通過接受消息、處理消息、傳出消息或使用其他類的方法來實現一定功能,這叫做消息傳遞機制(Message Passing)。
繼承性
繼承性(Inheritance)是指,在某種情況下,一個類會有"子類"。子類比原本的類(稱為父類)要更加具體化,例如,"狗"這個類可能會有它的子類"牧羊犬"和"奇瓦瓦犬"。在這種情況下,"萊絲"可能就是牧羊犬的一個實例。子類會繼承父類的屬性和行為,並且也可包含它們自己的。我們假設"狗"這個類有一個方法叫做"吠叫()"和一個屬性叫做"毛皮顏色"。它的子類(前例中的牧羊犬和奇瓦瓦犬)會繼承這些成員。這意味著程序員只需要將相同的代碼寫一次。 在偽代碼中我們可以這樣寫:
類牧羊犬:繼承狗 定義萊絲是牧羊犬 萊絲.吠叫() /* 注意這里調用的是狗這個類的吠叫屬性。 */
回到前面的例子,"牧羊犬"這個類可以繼承"毛皮顏色"這個屬性,並指定其為棕白色。而"奇瓦瓦犬"則可以繼承"吠叫()"這個方法,並指定它的音調高於平常。子類也可以加入新的成員,例如,"奇瓦瓦犬"這個類可以加入一個方法叫做"顫抖()"。設若用"牧羊犬"這個類定義了一個實例"萊絲",那麼萊絲就不會顫抖,因為這個方法是屬於奇瓦瓦犬的,而非牧羊犬。事實上,我們可以把繼承理解為"是"。例如,萊絲"是"牧羊犬,牧羊犬"是"狗。因此,萊絲既繼承了牧羊犬的屬性,又繼承了狗的屬性。 我們來看偽代碼:
類奇瓦瓦犬:繼承狗 開始 公有成員: 顫抖() 結束 類牧羊犬:繼承狗 定義萊絲是牧羊犬 萊絲.顫抖() /* 錯誤:顫抖是奇瓦瓦犬的成員方法。 */
當一個類從多個父類繼承時,我們稱之為"多重繼承"。多重繼承並不總是被支持的,因為它很難理解,又很難被好好使用。
封裝性
具備封裝性(Encapsulation)的面向對象程序設計隱藏了某一方法的具體執行步驟,取而代之的是通過消息傳遞機制傳送消息給它。因此,舉例來說,"狗"這個類有"吠叫()"的方法,這一方法定義了狗具體該通過什麼方法吠叫。但是,萊絲的朋友蒂米並不需要知道它到底如何吠叫。 從實例來看:
/* 一個面向過程的程序會這樣寫: */
定義萊絲 萊絲.設置音調(5) 萊絲.吸氣() 萊絲.吐氣() /* 而當狗的吠叫被封裝到類中,任何人都可以簡單地使用: */ 定義萊絲是狗 萊絲.吠叫()
封裝是通過限制只有特定類的實例可以訪問這一特定類的成員,而它們通常利用介面實現消息的傳入傳出。舉個例子,介面能確保幼犬這一特徵只能被賦予狗這一類。通常來說,成員會依它們的訪問許可權被分為3種:公有成員、私有成員以及保護成員。有些語言更進一步:Java可以限制同一包內不同類的訪問;C#和VB.NET保留了為類的成員聚集准備的關鍵字:internal(C#)和Friend(VB.NET);Eiffel語言則可以讓用戶指定哪個類可以訪問所有成員。
多態性
多態性(Polymorphism)指方法在不同的類中調用可以實現的不同結果。因此,2個甚至更多的類可以對同一消息作出不同的反應。舉例來說,狗和雞都有"叫()"這一方法,但是調用狗的"叫()",狗會吠叫;調用雞的"叫()",雞則會啼叫。 我們將它體現在偽代碼上:
類狗 開始 公有成員: 叫() 開始 吠叫() 結束 結束 類雞 開始 公有成員: 叫() 開始 啼叫() 結束 結束 定義萊絲是狗 定義魯斯特是雞 萊絲.叫() 魯斯特.叫()
這樣,同樣是叫,萊絲和魯斯特做出的反應將大不相同。多態性的概念可以用在運算符重載上,本文不再贅述。
抽象性
抽象(Abstraction)是簡化復雜的現實問題的途徑,它可以為具體問題找到最恰當的類定義,並且可以在最恰當的繼承級別解釋問題。舉例說明,萊絲在大多數時候都被當作一條狗,但是如果想要讓它做牧羊犬做的事,你完全可以調用牧羊犬的方法。如果狗這個類還有動物的父類,那麼你完全可以視萊絲為一個動物。
OOP名詞釋意
編程范型 對於OOP的准確定義及其本意存在著不少爭論。
通常,OOP被理解為一種將程序分解為封裝數據及相關操作的模塊而進行的編程方式。有別於其它編程方式,OOP中的與某數據類型相關的一系列操作都被有機地封裝到該數據類型當中,而非散放於其外,因而OOP中的數據類型不僅有著狀態,還有著相關的行為。OOP理論,及與之同名的OOP實踐相結合創造出了新的一個編程架構;OOP思想被廣泛認為是非常有用的,以致一套新的編程范型被創造了出來。(其它的編程范型例如函數式編程或過程序編程專注於程序運行的過程,而邏輯編程專注於引發程序代碼執行的斷言)
對面向模擬系統的語言(如:SIMULA 67)的研究及對高可靠性系統架構(如:高性能操作系統和CPU的架構)的研究最終導致了OOP的誕生。
一些專家認為Object-Orientation中的Object的本意來自於其在語法領域的意義,即應將其理解為"賓語"或"操作對象",而非一般的"對象"或"對象"。我們所見到的軟體的運行請求通常都是Subject-Oriented的,即"面向主語的"或"面向操作者的",然而這樣將使得對操作者對象的設計變得困難而復雜。有鑒於此,部分研究人員開始了對"面向操作對象"的思考。這又一次產生了新的編程范型,這是前邊提到的"面向操作者"的思考模式的一項革新。
依照"面向操作對象"的原則,在程序語句中的動詞應該被劃分到操作對象的類型之中,而與該動詞請求相關的邏輯關系也就因此將在操作對象中處理。以下是採用"面向操作對象"的方式翻譯"面向操作者"的一些例子:
面向操作者:銷售系統保存交易記錄。
面向操作對象:交易記錄在接受到銷售系統的一條請求消息後將自身保存。
面向操作者:銷售系統列印收據。
面向操作對象:收據在接收到銷售系統的一條請求消息後將自身列印。
面向對象的語言
支持部分或絕大部分面向對象特性的語言即可稱為基於對象的或面向對象的語言。早期,完全面向對象的語言主要包括Smalltalk等語言,目前較為流行的語言中有Java、C#、Eiffel等。隨著軟體工業的發展,比較早的面向過程的語言在近些年的發展中也紛紛吸收了許多面向對象的概念,比如C->C++,BASIC->Visual Basic->Visual Basic .NET,Pascal->Object Pascal,Ada->Ada95。
歷史
對象和實例的最早概念出自麻省理工大學的PDP-1系統。這一系統大概是capability based architecture的最早示例。另一個早期的事例是1963年Ivan Sutherland開發的Sketchpad;但是,這並非是一種編程思想,而只是一個程序。
對象最早在20世紀60年代的Simula 67中被引入程序設計中。Simula這一語言是Ole-Johan Dahl和Kristen Nygaard在奧斯陸計算機中心為模擬環境而設計的。(據說,他們是為了模擬船隻而設計的這種語言,並且對不同船隻間屬性的相互影響感興趣。他們將不同的船隻歸納為不同的類,而每一個對象,基於它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程序的最早概念體現。在分析式程序中,我們將真實世界的對象映射到抽象的對象,這叫做"模擬"。Simula不僅引入了"類"的概念,還應用了實例這一思想--這可能是這些概念的最早應用。20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向對象程序設計的概念定義為,在基礎運算中,對對象和消息的廣泛應用。Smalltalk的創建者深受Simula 67的主要思想影響,但Smalltalk中的對象是完全動態的--它們可以被創建、修改並銷毀,這與Simula中的靜態對象有所區別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可創建實例的程序設計模型和不具備繼承性的Simula。
此外,Simula 67的思想亦被應用在許多不同的語言,如Lisp、Pascal。
面向對象程序設計在80年代成為了一種主導思想,這主要應歸功於C++--C語言的擴充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向對象程序設計很好地適應了潮流。GUI和面向對象程序設計的緊密關聯在Mac OS X中可見一斑。Mac OS X是由面向對象C語言寫成的,這一語言是一個仿Smalltalk的C語言擴充版。面向對象程序設計的思想也使事件處理式的程序設計更加廣泛被應用(雖然這一概念並非僅存在於面向對象程序設計)。一種說法是,GUI的引入極大地推動了面向對象程序設計的發展。
在ETH Zürich(英文),Niklaus Wirth 和他的同事們對抽象數據和模塊化程序設計進行了調查。Mula-2將這些都包括了進去,而Oberon則包括了一種特殊的面向對象方法--不同於Smalltalk與C++。
面向對象的特性也被加入了當時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有面向對象的設計,故而這種糅合常常會導致兼容性和維護性的問題。與之相反的是,"純正的"面向對象語言卻缺乏一些程序員們賴以生存的特性。在這一大環境下,開發新的語言成為了當務之急。作為先行者,Eiffel成功地解決了這些問題,並成為了當時較受歡迎的語言。在過去的幾年中,Java語言成為了廣為應用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因為這一特性,已吸引了龐大的程序員群的投入。
近日,一些既支持面向對象程序設計,又支持面向過程程序設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等.
正如面向過程程序設計使得結構化程序設計的技術得以提升,現代的面向對象程序設計方法使得對設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。
腳本中的OOP
近年來,面向過程程序設計越發流行於腳本語言。Python和Ruby是建立在OOP原理的腳本語言,Perl和PHP亦分別在Perl 5和PHP 4時加入面向過程特性。
⑹ php oop私有變數賦值
提供一個方法給他。例如
class apple {
private $name;
public function setName($name){
$this->name = $name;
}
}
至於文本框什麼的,就是$_GET變數可以獲取到的啦
⑺ php面向對象面試題
其實這個問題很簡單啦,兩分鍾就可以請清楚啦,我在這里先說一下思想;
首先你得寫一個類表示人,如:person類;
小劉、小張、MrJosnon、MrJohn等都是這個person類的一個實例;
並且人力資源部問問題這是這個person類當中的一個方法,然後每個人都可以繼承自person類,然後又有各自己相關方法等;
然後你得寫一個國家類,如:Country類,然後中國是這個國家的一個具體實例;
然後你得寫一個城市類,如:City類;然後上海是City類的一個實例;
同樣,你得寫一個公司類,如:Company類,然後那兩個公司又是Company類的兩個實例,並且你還得寫一個部門類,如:Depart類,然後人力資源部是部門的一個實例;
上面只是這個問題的中文描述,你可以參考一下;