講到html' target='_blank'>面向對象 先回顧下以前的編程思路,所謂編程思路就是根據知識本質原理通過邏輯推理程序的過程,編程思路,講究的是先明確要做的事情是怎么。離開代碼的情況下,自己也要能明白這一件事情怎么做。而不是把代碼背一遍。跟據要做的事情,去確認各種已知條件,沒有條件的要自己創造條件。也就是:知道條件,知道結果,求過程。 在實際程序中 我們往往要做很多的準備工作 去創造滿足條件,比如要輸出mysql的一段數據我們需要準備分頁計算,才知道要從哪里輸出到哪里,往往一個程序中。一個功能,一個流程,不能滿足整個功能的需要。需要好幾個流程配合才能完成,比如,當網頁打開的時候做什么,當表單提交的時候做什么,沒有提交做什么,數據庫連不上的時候做什么連上的時候做什么。當沒有表單提交來的時候($_POST 為空的時候),我們就顯示表單。有數據提交來的時候,我們就連接數據庫,整理SQL語句,寫入數據庫。然后給用戶一個提示性的頁面。總結下來 ,我們整個程序在思考的時候 就會這么想 程序運行到這里的時候程序需要做什么,怎么做,才能滿足下一個流程的需求,這幾個流程組合起來,才能滿足整個功能的需求,這種思考方式,我們稱之為面向過程,面向過程 總結下來 思考模式有一個共通的特點:什么時候做什么,怎么做,每一個流程 每一步。這就是面向過程。
其實在我們寫代碼的時候 九成以上都是面向過程,而相對的面向對象 只是一種思考方式的名字,很多的時候我們也會使用面向對象的方式思考 只是自己不知道罷了,以下代碼是一個簡單的例子:
$file = 'test.txt';//指定打開的文件$fp = fopen($file, 'r');//打開文件$data = fread($fp, 1024);//讀取數據賦值fclose($fp);//關閉文件echo $data;//輸出
一段代碼對應了一個過程
我們在讀取數據庫的時候現在很多人應該是這么思考的了。//連接數據庫//查詢數據庫//顯示結果,
如果是身份驗證。還多一個流程。//連接數據庫//查詢數據庫//對比用戶名和密碼//顯示結果。這個注釋其實就是思路的描述,當我們寫代碼熟練到一定程度的時候,就已經沒必要去一行一行的想了。往往想到一個流程,就是幾行代碼,但是,代碼實際的功能,必須和思考的過程吻合。
還是上面的一段代碼
$fp = fopen($file, 'r');$data = fread($fp, 1024);fclose($fp);//整體注釋就是:讀取“文件”的“內容”//如果我換成另一個同樣功能函數呢$file='test.txt';
這個寫法,更符合我們剛才的描述:讀取文件內容。在這里,$file 我們思考的時候,把它看成了一個文件。
又比如 對于圖形處理過程我們可以理解為:創建一張圖像,往圖像里寫字,往圖像里畫線,輸出圖像,把這個資源量看成這張圖像本身。
所謂的面向對象就是思考模式的描述,在這種思考模式下我們把要處理的各個東西想象成一個個實體,讀取文件 處理數據 寫入文件 。。創建圖像 在圖像上繪畫 在圖像上寫字 輸出圖像 雖然從代碼本質上來解讀的話它們還是一個個的各種量,這一點自己潛意識清楚就可以了。在思考和描述的時候,要是也一個個這么想。會給思考帶來一定的困難。而用上面的這種思考和描述方式。就簡單得多了,這種思考方式就是面向對象,類似上面面向過程那樣的一句話就是:什么時候 誰 做什么。
面向過程是:什么時候,做什么,怎么做
面向對象是:什么時候,什么東西,做什么。在面向對象的時候少了一個怎么做 那是因為面向對象的前提是你已經知道怎么做了,這也是我們為什么總是先學習面向過程 如果我們一件事情 怎么做都不知道,就談不上什么思考模式了。其實對于 圖像處理函數就是基于面向對象思考模式開發的 從頭到尾都是對這張圖片做什么,思考模式,并不局限于書寫方式,并不是說這么寫就是面向對象 那樣寫 就是面向過程,在我們精通了各種功能的實現手法以后。我們往往會通過封裝來重復使用代碼。那怎么封裝更合理呢。這個時候,看思考方式,之前說過。思路描述,要能和代碼吻合。那么封裝就不是隨意的封裝了,封裝好的函數和類, 用起來的時候最好能和思考描述的一樣,是書寫格式。。和思路描述。。盡可能的吻合。
function read($file) {}//讀取文件$data = read($file);
符合度百分之百,當然前提你得知道怎么封裝這樣一個函數,在此由于$file是文件名 將它視為文件有點牽強,但我們可以理解為文件的路徑path,所以 最好使用類去封裝。
用我們日常生活的常識來理解對象的話 對象時一個個實體,那么它對應的就應該有一些特性,比如說文件名是什么,路徑是多少,文件大小多少,比如說我們人 有身高體重名字性別,但是,在我們平時的制作手法里面。我們要知道一個文件大小。就必須用 filesize 函數去取得。這就像我問你身高是多少,你每次都要重新量一下。這和我們常識中的對象,存在一定的差距,使得我們在思考描述代碼的時候。代碼的符合度不夠。 但是類可以暫時記住這些特征值,我們稱之為對象的屬性,屬性,一定是一個準確的值,而過程在類里面稱為方法,類里面 可以聲明一些特殊的變量,這些變量外部不能直接訪問到,這些就是類的屬性,要想訪問一個類的屬性和方法一樣使用-> 但是不需要寫$,假如我們有一個file類 有一個屬性
$file = new file();echo $file->size;
用這種方式來訪問一個對象變量的屬性 怎么定義它 我們先不急 慢慢道來 ,我們先回到思路上,今天我們封裝一個文件讀寫類 我們的代碼在需要文件讀寫的時候我們這樣思考:讀取文件 處理數據 寫入文件 ,這個思路正是文件型計數器的思路。
那么,我們最好的寫法是
$data = read($file);$data +=1;write($file, $data);
function read($file) { $fp = fopen($file, 'r'); $data = fread($fp, filesize($file)); fclose($fp); return $data; } function write($file, $data) { $fp = fopen($file, 'w'); $rs = fwrite($fp, $data); fclose($fp); return $rs; }
這兩個函數。都是同屬于文件操作的。我們把它封裝成為類
class fileclass { function read($file) { $fp = fopen($file, 'r'); $data = fread($fp, filesize($file)); fclose($fp); return $data; } function write($file, $data) { $fp = fopen($file, 'w'); $rs = fwrite($fp, $data); fclose($fp); return $rs; }}
調用這個類的時候。代碼是這么寫的。
$fc = new fileclass();//讀取文件$data = $fc->read($file);$data +=1;//寫入文件$fc->write($file, $data);然而這里有個和思路不符的地方,上下的兩個$file可以是兩個不同的文件,也就是說我可以從文件A讀取內容寫入到文件B中,但是這樣一來就是兩個文件,就是兩個對象,這個和思路不符,在這個代碼中,我們沒辦法準確的描述出。哪一個量。可以視為這個文件。 盡管使用了類從思維上還是面向的過程,之前說過 作為對象應該有自己的屬性,對象 應該知道自己的屬性,我們希望 用一個實例化的量 來表示這個對象,一個對象 一旦出現就知道自己的屬性,就如我們都知道的姓名和性別,要做到這幾點,我們需要修改類的結構,一開始就知道。。就是說。一開始就得知道文件名。而且一開始就要讀取文件大小。 畢竟,沒有這些過程 不可能憑空得到。在類里面。構造函數可以幫我們做到這一點。構造函數。會在類實例化的時候立即執行。我們可以在構造函數里讀取文件的大小,要讀取文件大小,同樣需要知道文件名。這就需要一個條件。可以通過函數參數傳入。
public function __construct($file) { $size = filesize($file); }我們都知道,自定義函數內部變量和外部變量。不是同一個世界的。也就是說。在這里給$size賦值。屬性size是得不到的。 在這里在類的方法里面,要想訪問類的屬性和其他方法。需要用關鍵字 $this->
<?phpclass fileclass { public $size = 0; public $name = ''; public function __construct($file) { $size = filesize($file); $this->size = $size; $this->name = $file; } function read($file) { $fp = fopen($file, 'r'); $data = fread($fp, filesize($file)); fclose($fp); return $data; } function write($file, $data) { $fp = fopen($file, 'w'); $rs = fwrite($fp, $data); fclose($fp); return $rs; }}$fc = new fileclass('test.txt');echo '文件名:' . $fc->name;echo '文件大小:' . $fc->size;?>
現在回到read方法 既然他已經有屬性 知道自己名字和大小了 那在這里就不用再傳文件名進去了,
function read() { $fp = fopen($this->name, 'r'); $data = fread($fp, filesize($this->size)); fclose($fp); return $data; }同樣的。寫入的時候。也不需要再通知文件名了。
class fileclass { public $size = 0; public $name = ''; public function __construct($file) { $size = filesize($file); $this->size = $size; $this->name = $file; } function read() { $fp = fopen($this->name, 'r'); $data = fread($fp, filesize($this->name)); fclose($fp); return $data; } function write($data) { $fp = fopen($this->name, 'w'); $rs = fwrite($fp, $data); fclose($fp); return $rs; }}現在,整個類就變成了這個樣子。回到剛才的計數器代碼。
$fc = new fileclass('test.txt');//讀取文件$data = $fc->read();$data +=1;echo $data;//寫入文件$fc->write($data);由于讀取是一個過程,也就是一個方法。從哪讀取的? $fc $fc此時,可以完全的理解為。就是文件本身了。 總結下:面向對象這種思維方式。講究的是:什么時候,什么東西,做什么 。為了能讓代碼書寫的時候,更符合這種描述方式,我們需要把過程封裝起來。而類。只不過是為了能更準確的符合這種思考描述方式而做的準備性封裝,不是說用類就是在用 面向對象 編程了。一個類寫出來以后。如果在使用的過程中。不符合面向對象的思維方式。。那也只是普通的類,面向對象思維方式。。一定要有準確的對象。。可以把某個量。視為一個實體的東西。也就是“對象” 。歸根到底其實是先有思路才有類的。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答