php之面向對象(2)

 註意:看這篇文章之前建議看看之前的文章,因為內容之間銜接性比較強。勿噴。。

 

  面向對象,是一種思維模式的名字,並不是指某種特定的寫法,面向對象簡稱oop,思路的核心在於:什麼時候 什麼東西 做什麼。

 

  編程講究代碼與思路的絕對吻合,如果代碼沒有對應思路的某個過程,那麼思路就和代碼脫節瞭,那麼代碼的由來就有待考證瞭,由於面向對象的描述,不在意具體的細節描述,隻在意什麼東西做什麼,為瞭能讓代碼和思路吻合,封裝便應運而生,隻有封裝才能使得一句代碼對應一個做什麼,這就意味著我們需要知道自己事先準備好一堆“做什麼”,要麼自己封裝,要麼用別人封裝好的,為瞭使代碼更準確的符合面向對象的描述,我們需要用一個個的量來假想成為這個什麼東西,因為程式最終處理的時量,但是普通的量往往是一個個的準確的值,這樣寫出來的代碼,頂多可以讀作:讀取一個文件寫入一個文件,而不便於讀作:文件做什麼,正如之前所說的面向對象講究的是什麼時候什麼東西做什麼 ,所以通常情況下我們會用實例化之後的類來表示這個對象,因為實例化後的類裡面有方法,這樣一來,我們在使用這個實例化後的類時就可以把這個量視作一個對象,類裡面的方法 我們在代碼編寫的時候可以通過這個量調用裡面的方法,就更符合:什麼東西做什麼。

 

  比如說:read($file);  我們可以讀作:讀取“這個文件”,這裡的重點是“讀取”,文件隻是被讀取的東西,而讀取是一個過程。這種思考模式就還稱不上是面向對象而是面向過程。面向對象應該符合:什麼東西做什麼。$file->read();   這個寫法,就很容易看得出來,是 文件->讀取 ,是“文件”在讀取,這樣的描述就更符合面向對象的思維模式。所以說。面向對象封裝起來隻是為瞭代碼更符合思維的描述。 為瞭寫的時候,代碼更符合思維的描述。在之前我們肯定看過別人寫的類 可能會看到一些方法,裡面隻有一個賦值,這看似蛋疼和多餘的寫法其實是為瞭在使用這個類的時候代碼看起來能和思維一致的緣故,上一篇的博客上 封裝的一個文件類 如果我們有兩個文件每個文件都看成一個對象 我們希望從文件A裡讀出內容然後寫入文件B裡,A和B分別是兩個文件,那我們就用這個類來描述一下這個事情。

 

復制代碼

$a = new fileclass("a.txt");

$b = new fileclass("b.txt");

 

//A把自己文件讀出來

$data = $a->read();

 

//B記下這個文件

$b->write($data);

 

echo $b->read();

復制代碼

完整代碼如下

 

復制代碼

<?php

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, $op = 'a') {

        $fp = fopen($this->name, $op);

        $rs = fwrite($fp, $data);

        fclose($fp);

        return $rs;

    }

 

}

 

$a = new fileclass("test.txt");

$b = new fileclass("b.txt");

 

//A把自己文件讀出來

$data = $a->read();

 

//B記下這個文件

$b->write($data);

echo $b->read();

?>

復制代碼

當然 $b->write($data);可以改變其文件模式,很明顯第一次運行有錯誤 再運行一次看看,這個類是為瞭實現這個描述而做的準備,為瞭使對象看起來更像一個活的對象,它必須知道自己的名字。必須知道自己的大小,它必須能“做點什麼”,所以test.txt b.txt需要存在,為此我們需要在封裝的時候多用點心思。所以是先有瞭使用時的思路才有瞭類的封裝,一個類,要封裝的符合描述這個用法才是一個合格的類,為此官方推出一個類庫pear,提供瞭一大堆事先封裝好的類,我們拿來用就好瞭,如果我們從別的地方知道一個類我們應該如何使用呢?第一步就是:知道這個類,是針對什麼對象開發的。如果一個類,不針對任何對象開發,那它就隻是一種封裝方式而已, 當自定義函數用就好瞭。第二步:知道這個類,都為我們的對象,提供瞭什麼屬性和方法,通過屬性,我們可以得到對象的什麼參數。。或者改變屬性值。我們可以讓對象產生什麼樣的變化,都有什麼方法,這些方法,都能讓對象做什麼,具體怎麼做到的,就不用管瞭,如果你是為瞭學習怎麼做到這個過程的話,可以去看一下別人的類的源代碼。 現在我們體驗一下,之前的內容有代碼分離也就是模板技術。原理是把所有控制輸出的代碼寫在另一個文件,需要輸出的時候再進行包含,要點是:模板文件裡的變量要有嚴格的約定,必須知道模板裡面有什麼可以輸出的變量,什麼樣子的變量,才能準確的賦值上去。還有另一種模板原理是標記型的模板,在模板上,做上各種記號。然後,把要賦值的變量和記號一一替換。 為瞭避免變量名沖突,我們往往把變量先暫存在另一個地方。 要顯示的時候,再取回這些變量,處理過後,賦值到模板上。 不管是直接賦值上去,還是替換上去。 為瞭便於管理這些過程,我們一般都會選擇封裝。 一是為瞭便於重復使用代碼。二是為瞭隔離當前代碼的變量,於是,就出現瞭使用各種不同思路制作的模板封裝。 別人封裝好的。我們知道原理就可以瞭,反正不外乎就是替換變量或者直接賦值。 於是再次提到瞭smarty。。。smarty內容見下一篇。。

 

 

You May Also Like