PHP物件導向教程之自訂類_php執行個體

來源:互聯網
上載者:User

那怎麼開始設計一個合格的類呢,一開始就寫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
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];  
    }

 之後,我們可以在儲存的方法裡,載入原圖,改變大小,並儲存到指定的位置上,至於儲存方法的書寫不同的類型調用的函數時不同的可以選擇使用switch ($var[2])進行判斷 在進行建立一個縮圖然後儲存。

複製代碼 代碼如下:

//按這個類的編寫方式。。使用方法應該是這樣

$simg = new simg("1.jpg");

//讀取寬高並計算
$simg->width

//設定大小
$simg->size(200, 200);
//儲存到
$simg->save("2.jpg");

 和描述有點不一樣 ,因為描述是:使用(這個)大小,另存新檔(這裡)這個描述有點繞口,如果可以這樣寫就沒問題了$simg->size(200, 200)->save("2.jpg");對象的使用必須是這樣的對象->方法()這就要求前面的量裡的值必須是一個對象,save前面是size這就要求size的傳回值必須是一個對象,但是這個方法沒有什麼東西需要返回,而且這個對象肯定是當前對象,才會有save方法,沒有對象不要緊我們自己添加一個,

 

複製代碼 代碼如下:

public function size($width, $height) {
        $this->w = $width;
        $this->h = $height;
        return $this;
    }

返回當前的對象,這樣就可以用圖片 使用(這個)大小,另存新檔(這裡)$simg->size(200, 200)->save("2.jpg");這樣一個符合oop思想的類封裝完成了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.