程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php之面向對象

php之面向對象

編輯:關於PHP編程

  講到面向對象 先回顧下以前的編程思路,所謂編程思路就是根據知識本質原理通過邏輯推理程序的過程,編程思路,講究的是先明確要做的事情是怎麼。離開代碼的情況下,自己也要能明白這一件事情怎麼做。而不是把代碼背一遍。跟據要做的事情,去確認各種已知條件,沒有條件的要自己創造條件。也就是:知道條件,知道結果,求過程。 在實際程序中 我們往往要做很多的准備工作 去創造滿足條件,比如要輸出mysql的一段數據我們需要准備分頁計算,才知道要從哪裡輸出到哪裡,往往一個程序中。一個功能,一個流程,不能滿足整個功能的需要。需要好幾個流程配合才能完成,比如,當網頁打開的時候做什麼,當表單提交的時候做什麼,沒有提交做什麼,數據庫連不上的時候做什麼連上的時候做什麼。 當沒有表單提交來的時候($_POST 為空的時候),我們就顯示表單。有數據提交來的時候,我們就連接數據庫,整理SQL語句,寫入數據庫。然後給用戶一個提示性的頁面。總結下來 ,我們整個程序在思考的時候 就會這麼想 程序運行到這裡的時候程序需要做什麼,怎麼做,才能滿足下一個流程的需求,這幾個流程組合起來,才能滿足整個功能的需求,這種思考方式,我們稱之為面向過程,面向過程 總結下來 思考模式有一個共通的特點:什麼時候做什麼,怎麼做,每一個流程 每一步。這就是面向過程。

  其實在我們寫代碼的時候 九成以上都是面向過程,而相對的面向對象 只是一種思考方式的名字,很多的時候我們也會使用面向對象的方式思考 只是自己不知道罷了,以下代碼是一個簡單的例子:

 = "test.txt" = (, "r" = (, 1024( ;//輸出

一段代碼對應了一個過程

  我們在讀取數據庫的時候現在很多人應該是這麼思考的了。//連接數據庫//查詢數據庫//顯示結果,

  如果是身份驗證。還多一個流程。//連接數據庫//查詢數據庫//對比用戶名和密碼//顯示結果。這個注釋其實就是思路的描述,當我們寫代碼熟練到一定程度的時候,就已經沒必要去一行一行的想了。往往想到一個流程,就是幾行代碼,但是,代碼實際的功能,必須和思考的過程吻合。

還是上面的一段代碼

 = (, "r" = (, 1024(
 //如果我換成另一個同樣功能函數呢
  $file = "test.txt";
  $data = file_get_contents($file); 


這個寫法,更符合我們剛才的描述:讀取文件內容。在這裡,$file 我們思考的時候,把它看成了一個文件。

  又比如 對於圖形處理過程我們可以理解為:創建一張圖像,往圖像裡寫字,往圖像裡畫線,輸出圖像,把這個資源量看成這張圖像本身。

  所謂的面向對象就是思考模式的描述,在這種思考模式下我們把要處理的各個東西想象成一個個實體,讀取文件  處理數據  寫入文件  。。創建圖像 在圖像上繪畫  在圖像上寫字  輸出圖像 雖然從代碼本質上來解讀的話它們還是一個個的各種量,這一點自己潛意識清楚就可以了。在思考和描述的時候,要是也一個個這麼想。會給思考帶來一定的困難。而用上面的這種思考和描述方式。就簡單得多了,這種思考方式就是面向對象,類似上面面向過程那樣的一句話就是:什麼時候  誰 做什麼。

  面向過程是:什麼時候,做什麼,怎麼做
  面向對象是:什麼時候,什麼東西,做什麼。在面向對象的時候少了一個怎麼做 那是因為面向對象的前提是你已經知道怎麼做了,這也是我們為什麼總是先學習面向過程 如果我們一件事情 怎麼做都不知道,就談不上什麼思考模式了。其實對於 圖像處理函數就是基於面向對象思考模式開發的 從頭到尾都是對這張圖片做什麼,思考模式,並不局限於書寫方式,並不是說這麼寫就是面向對象 那樣寫 就是面向過程, 在我們精通了各種功能的實現手法以後。我們往往會通過封裝來重復使用代碼。那怎麼封裝更合理呢。 這個時候,看思考方式,之前說過。思路描述,要能和代碼吻合。那麼封裝就不是隨意的封裝了,封裝好的函數和類, 用起來的時候最好能和思考描述的一樣,是書寫格式。。和思路描述。。盡可能的吻合。 

 比如,我把剛才讀取文件的過程。封裝成一個函數 
 read(
 = read();

符合度百分之百,當然前提你得知道怎麼封裝這樣一個函數,在此由於$file是文件名 將它視為文件有點牽強,但我們可以理解為文件的路徑path,所以 最好使用類去封裝。

  用我們日常生活的常識來理解對象的話 對象時一個個實體,那麼它對應的就應該有一些特性,比如說文件名是什麼,路徑是多少,文件大小多少,比如說我們人 有身高體重名字性別,但是,在我們平時的制作手法裡面。我們要知道一個文件大小。就必須用 filesize 函數去取得。這就像我問你身高是多少,你每次都要重新量一下。 這和我們常識中的對象,存在一定的差距,使得我們在思考描述代碼的時候。代碼的符合度不夠。 但是類可以暫時記住這些特征值,我們稱之為對象的屬性,屬性,一定是一個准確的值,而過程在類裡面稱為方法,類裡面 可以聲明一些特殊的變量,這些變量外部不能直接訪問到,這些就是類的屬性,要想訪問一個類的屬性和方法一樣使用-> 但是不需要寫$,假如我們有一個file類 有一個屬性

 =   ->size;

用這種方式來訪問一個對象變量的屬性 怎麼定義它 我們先不急 慢慢道來 ,我們先回到思路上,今天我們封裝一個文件讀寫類 我們的代碼在需要文件讀寫的時候我們這樣思考:讀取文件 處理數據 寫入文件 ,這個思路正是文件型計數器的思路。

那麼,我們最好的寫法是

 = read( +=1, );
     read( = (, "r" = (, ((  write(,  = (, "w" = (, ( 

 這兩個函數。都是同屬於文件操作的。我們把它封裝成為類

 read( = (, "r" = (, ((  write(,  = (, "w" = (, ( 

調用這個類的時候。代碼是這麼寫的。

 = //讀取文件
 = ->read( +=1//寫入文件
->write(, );
然而這裡有個和思路不符的地方,上下的兩個$file可以是兩個不同的文件,也就是說我可以從文件A讀取內容寫入到文件B中,但是這樣一來就是兩個文件,就是兩個對象,這個和思路不符,在這個代碼中,我們沒辦法准確的描述出。哪一個量。可以視為這個文件。 盡管使用了類從思維上還是面向的過程,之前說過 作為對象應該有自己的屬性,對象 應該知道自己的屬性,我們希望 用一個實例化的量 來表示這個對象,一個對象 一旦出現就知道自己的屬性,就如我們都知道的姓名和性別,要做到這幾點,我們需要修改類的結構,一開始就知道。。就是說。一開始就得知道文件名。而且一開始就要讀取文件大小。 畢竟,沒有這些過程 不可能憑空得到。在類裡面。構造函數可以幫我們做到這一點。構造函數。會在類實例化的時候立即執行。我們可以在構造函數裡讀取文件的大小,要讀取文件大小,同樣需要知道文件名。 這就需要一個條件。可以通過函數參數傳入。
     __construct( = (
 我們都知道,自定義函數內部變量和外部變量。不是同一個世界的。 也就是說。在這裡給 $size 賦值。屬性 size 是得不到的。 在這裡 在類的方法裡面,要想訪問類的屬性和其他方法。需要用關鍵字 $this->
<?  = 0  = ''  __construct( = (->size = ->name =  read( = (, "r" = (, ((  write(,  = (, "w" = (, (  =  fileclass("test.txt" "文件名:" . -> "文件大小:" . ->?>

 

現在回到read方法 既然他已經有屬性 知道自己名字和大小了 那在這裡就不用再傳文件名進去了,

     = (->name, "r" = (, (->( 
 同樣的。寫入的時候。也不需要再通知文件名了。
  = 0  = ''  = (->size = ->name =  = (->name, "r" = (, (->name(  write( = (->name, "w" = (, ( 
 現在,整個類就變成了這個樣子。 回到剛才的計數器代碼。 
 =  fileclass("test.txt" = -> +=1 ->write();
 由於讀取是一個過程,也就是一個方法。從哪讀取的? $fc  $fc 此時,可以完全的理解為。就是文件本身了。   總結下:面向對象這種思維方式。講究的是:什麼時候,什麼東西,做什麼 。為了能讓代碼書寫的時候,更符合這種描述方式,我們需要把過程封裝起來。而類。只不過是為了能更准確的符合這種思考描述方式而做的准備性封裝,不是說用類就是在用 面向對象 編程了。一個類寫出來以後。如果在使用的過程中。不符合面向對象的思維方式。。那也只是普通的類,面向對象思維方式。。一定要有准確的對象。。可以把某個量。視為一個實體的東西。也就是“對象” 。歸根到底其實是先有思路才有類的。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved