所謂面向對象就是何時什麼東西作什麼,咱們設計類的時候須要想的就是怎麼作的內容,那麼怎麼樣的一個類纔算是符合OOP的思想呢,答案是:這個類寫好以後,在使用的過程當中,能準確的表明一個事物,在書寫的時候代碼要和思惟描述一致,即這個東西作什麼。
那怎麼開始設計一個合格的類呢,一開始就寫class{}的都錯了,正確的是什麼都不寫,而是假設這個類已經存在,這個對象已經存在,各類屬性方法都已經有了,在這個徹底的假設下想象下這個對象應該怎麼用,例如咱們製做一個縮略圖的類,咱們但願封裝成一個類,方便下次使用,咱們首先須要明確對象是什麼它會作什麼,要製做縮略圖本質操做是縮小圖片並輸出,這裏被操做的是圖片,那麼對象就是圖片,因爲網站上的圖片不是惟一的咱們得告訴這是那張圖片,這就能夠假設下這個類已經存在,一開始就得聲明是那張圖片,例如$simg = new simg("1.jpg");那麼,一張圖片應該有哪些屬性? 在製做縮略圖的時候,咱們最關心的應該是 寬,高,類型,並且這三項對一張圖片而言是確定的,這意味着這個對象必定有這些屬性,$simg->width,$simg->height,$simg->type,而且這些屬性一開始就能夠讀取的到的,
1 $simg = new simg("1.jpg"); 2 echo $simg->width; 3 echo $simg->height; 4 echo $simg->type; 5 //這個對象,應該能夠這樣操做。
根據oop的思想的原則,若是對象的屬性被改變,對象應當也會發生相應的改變,這就意味着咱們能夠給它賦值,取得對象的寬度,高度,計算後(好比按比例縮小),從新賦值回去。咱們本質是要製做一張圖片的縮略圖,也就是生成一張新的圖片,改變它以後,接下來要作的事情就應該是把這個改變過的圖片存起來了,存起來是一個過程,因此它會是一個方法。 例如 $simg->save(),考慮到要換一個地方存。至少要改一個名字吧, 也就是說在使用的時候,這個對象應該是這樣描述的,圖片 保存到 …… 這意味着,這個方法,有一個參數,就是保存到哪。
$simg = new simg("1.jpg");//實例化 $simg->width = 200;//設置寬度 $simg->height = 200;//設置高度 $simg->save("2.jpg");//保存到2.jpg
在使用這個類的時候思惟描述和寫出來的代碼應當徹底一致,這裏的思惟描述出現了一個小問題,可能會產生不符合oop思惟原則的誤導,這裏不符合面向對象的是:對象屬性從新賦值 原圖的大小爲何沒有發生變化,變化的是另存出來的,也就是說這個對象實際上是php內存中源對象的複製品,咱們改變了複製品的大小並保存了下來,因此圖片被真正改變以前圖片的屬性應當是只讀的,改寫是無效的, 因此,若是以原圖作爲對象來描述的話。這樣描述應該更準確:圖片 改變大小後 另存爲 。而原圖的大小是沒有發生改變的,改變大小是一個過程,這意味着這也是一個方法,
//這個類,用起來應該是這樣的。 //實例化一張圖片 $simg = new simg("1.jpg"); //讀取圖片寬高計算比例 $simg->width $simg->height //圖片使用指定的寬高另存爲…… $simg->size(200,200)->save("2.jpg");
這是以原圖作爲對象的角度來描述的,儘管是不存在的一個類,但它的用法必須事先存在,而且符合oop的思想原則,即這是個什麼東西,它能夠作些什麼。若是從另外的角度來思考呢,以即將被輸出的圖片做爲對象呢,那麼這個對象建立出來的時候它應該是空的,而後它必須以某張原圖爲基準,而後調整它的大小,再把它保存下來,
//按這個思路描述。代碼應該是這個樣子 $simg = new simg(); //一開始是空的 echo $simg->width; //確定是 0 $simg->load("1.jpg"); //以一張圖爲基準 echo $simg->width; //沒改過,是原圖大小 //改變大小 $simg->width = 200; $simg->height = 200; $simg->save("2.jpg"); //保存起來
此時看起來還不太明顯
下面會更好:
$simg = new simg("2.jpg"); //一開始是空的,指定一個文件名 $simg->load("1.jpg"); //以一張圖爲基準 //改變大小 $simg->width = 200; $simg->height = 200; $simg->save(); //保存起來
這樣會更明顯一些,實例化一個縮略圖,但它還不存在,直到保存之後它才存在於硬盤中 。php
在此咱們先按照第一種方式以原圖爲對象的角度建立這個類,根據上面的分析以下:網絡
<?PHP class simg { public $width = 0; public $height = 0; public function __construct($img) { } public function size($width, $height) { } public function save($path) { } }
以後再根據對每一個方法每一個屬性的要求,填上裏面的代碼,一開始就必須知道文件的高度,寬度,因爲php處理不一樣類型的圖片使用的函數不一樣,咱們在這裏不得不知道文件類型是多少。以決定用哪一個函數 設計類的時候,纔是思考「怎麼作」的時候,要在實例化以後,立刻知道寬高。必定是在構造函數裏完成的,只有構造函數會在類實例化的時候執行,這裏咱們可使用 getimagesize 函數,取得文件的寬度,高度,類型 ,寬度和高度,咱們能夠在這裏,賦值給屬性。這樣一來,實例化圖片,就獲得屬性的問題就解決了,那改變大小的過程呢?
<?PHP class simg { public $width = 0; public $height = 0; public function __construct($img) { $var = getimagesize($img); $this->width = $var[0]; $this->height = $var[1]; } public function size($width, $height) { } public function save($path) { } }
因爲網絡上經常使用的圖片類型有gif jpg png 三種,其餘的類型暫時不作考慮,調整大小的方法。在輸出以前是什麼也不作的。能夠說,咱們的代碼,只要知道要輸出的圖片是多大就能夠了 可是,不一樣的方法,內部變量不通用。怎麼辦註冊全局變量容易被外部變量干擾和污染,那咱們就利用類的屬性來保存。新加兩個屬性這裏暫定爲w和h,這兩個屬性,嚴格來講不是屬性,只是咱們利用屬性來在方法之間傳遞變量而已,爲了不它們在類的外部被訪問和修改咱們在定義的時候使用關鍵字私有來進行訪問限制,private $w = 0;private $h = 0;
public function size($width, $height) { $this->w = $width; $this->h = $height; }
public $width = 0; public $height = 0; public $path = ''; public $type = 0; private $w = 0; private $h = 0; public function __construct($img) { $var = getimagesize($img); $this->width = $var[0]; $this->height = $var[1]; $this->path = $img; $this->type = $var[2]; }
//按這個類的編寫方式。。使用方法應該是這樣 $simg = new simg("1.jpg"); //讀取寬高並計算 $simg->width //設置大小 $simg->size(200, 200); //保存到 $simg->save("2.jpg");
public function size($width, $height) { $this->w = $width; $this->h = $height; return $this; }
返回當前的對象,這樣就能夠用圖片 使用(這個)大小,另存爲(這裏)$simg->size(200, 200)->save("2.jpg");這樣一個符合oop思想的類封裝完成了。