PHP面向?qū)ο蠼坛讨远x類
那怎么開(kāi)始設(shè)計(jì)一個(gè)合格的類呢,一開(kāi)始就寫(xiě)class{}的都錯(cuò)了,正確的是什么都不寫(xiě),而是假設(shè)這個(gè)類已經(jīng)存在,這個(gè)對(duì)象已經(jīng)存在,各種屬性方法都已經(jīng)有了,在這個(gè)完全的假設(shè)下想象下這個(gè)對(duì)象應(yīng)該怎么用,例如我們制作一個(gè)縮略圖的類,我們希望封裝成一個(gè)類,方便下次使用,我們首先需要明確對(duì)象是什么它會(huì)做什么,要制作縮略圖本質(zhì)操作是縮小圖片并輸出,這里被操作的是圖片,那么對(duì)象就是圖片,由于網(wǎng)站上的圖片不是唯一的我們得告訴這是那張圖片,這就可以假設(shè)下這個(gè)類已經(jīng)存在,一開(kāi)始就得聲明是那張圖片,例如$simg = new simg("1.jpg");那么,一張圖片應(yīng)該有哪些屬性? 在制作縮略圖的時(shí)候,我們最關(guān)心的應(yīng)該是 寬,高,類型,而且這三項(xiàng)對(duì)一張圖片而言是肯定的,這意味著這個(gè)對(duì)象一定有這些屬性,$simg->width,$simg->height,$simg->type,并且這些屬性一開(kāi)始就可以讀取的到的,
1 $simg = new simg("1.jpg");
2 echo $simg->width;
3 echo $simg->height;
4 echo $simg->type;
5 //這個(gè)對(duì)象,應(yīng)該可以這樣操作。
根據(jù)oop的思想的原則,如果對(duì)象的屬性被改變,對(duì)象應(yīng)當(dāng)也會(huì)發(fā)生相應(yīng)的改變,這就意味著我們可以給它賦值,取得對(duì)象的寬度,高度,計(jì)算后(比如按比例縮?。匦沦x值回去。我們本質(zhì)是要制作一張圖片的縮略圖,也就是生成一張新的圖片,改變它之后,接下來(lái)要做的事情就應(yīng)該是把這個(gè)改變過(guò)的圖片存起來(lái)了,存起來(lái)是一個(gè)過(guò)程,所以它會(huì)是一個(gè)方法。 例如 $simg->save(),考慮到要換一個(gè)地方存。至少要改一個(gè)名字吧, 也就是說(shuō)在使用的時(shí)候,這個(gè)對(duì)象應(yīng)該是這樣描述的,圖片 保存到 …… 這意味著,這個(gè)方法,有一個(gè)參數(shù),就是保存到哪。
$simg = new simg("1.jpg");//實(shí)例化
$simg->width = 200;//設(shè)置寬度
$simg->height = 200;//設(shè)置高度
$simg->save("2.jpg");//保存到2.jpg
在使用這個(gè)類的時(shí)候思維描述和寫(xiě)出來(lái)的代碼應(yīng)當(dāng)完全一致,這里的思維描述出現(xiàn)了一個(gè)小問(wèn)題,可能會(huì)產(chǎn)生不符合oop思維原則的誤導(dǎo),這里不符合面向?qū)ο蟮氖牵簩?duì)象屬性重新賦值 原圖的大小為什么沒(méi)有發(fā)生變化,變化的是另存出來(lái)的,也就是說(shuō)這個(gè)對(duì)象其實(shí)是php內(nèi)存中源對(duì)象的復(fù)制品,我們改變了復(fù)制品的大小并保存了下來(lái),所以圖片被真正改變之前圖片的屬性應(yīng)當(dāng)是只讀的,改寫(xiě)是無(wú)效的, 所以,如果以原圖做為對(duì)象來(lái)描述的話。這樣描述應(yīng)該更準(zhǔn)確:圖片 改變大小后 另存為 。而原圖的大小是沒(méi)有發(fā)生改變的,改變大小是一個(gè)過(guò)程,這意味著這也是一個(gè)方法,
//這個(gè)類,用起來(lái)應(yīng)該是這樣的。
//實(shí)例化一張圖片
$simg = new simg("1.jpg");
//讀取圖片寬高計(jì)算比例
$simg->width
$simg->height
//圖片使用指定的寬高另存為……
$simg->size(200,200)->save("2.jpg");
這是以原圖做為對(duì)象的角度來(lái)描述的,盡管是不存在的一個(gè)類,但它的用法必須事先存在,并且符合oop的思想原則,即這是個(gè)什么東西,它可以做些什么。如果從另外的角度來(lái)思考呢,以即將被輸出的圖片作為對(duì)象呢,那么這個(gè)對(duì)象創(chuàng)建出來(lái)的時(shí)候它應(yīng)該是空的,然后它必須以某張?jiān)瓐D為基準(zhǔn),然后調(diào)整它的大小,再把它保存下來(lái),
//按這個(gè)思路描述。代碼應(yīng)該是這個(gè)樣子
$simg = new simg(); //一開(kāi)始是空的
echo $simg->width; //肯定是 0
$simg->load("1.jpg"); //以一張圖為基準(zhǔn)
echo $simg->width; //沒(méi)改過(guò),是原圖大小
//改變大小
$simg->width = 200;
$simg->height = 200;
$simg->save("2.jpg"); //保存起來(lái)
此時(shí)看起來(lái)還不太明顯
下面會(huì)更好:
$simg = new simg("2.jpg"); //一開(kāi)始是空的,指定一個(gè)文件名
$simg->load("1.jpg"); //以一張圖為基準(zhǔn)
//改變大小
$simg->width = 200;
$simg->height = 200;
$simg->save(); //保存起來(lái)
這樣會(huì)更明顯一些,實(shí)例化一個(gè)縮略圖,但它還不存在,直到保存以后它才存在于硬盤中 。
在此我們先按照第一種方式以原圖為對(duì)象的角度創(chuàng)建這個(gè)類,根據(jù)上面的分析如下:
<?PHP
class simg {
public $width = 0;
public $height = 0;
public function __construct($img) {
}
public function size($width, $height) {
}
public function save($path) {
}
}
之后再根據(jù)對(duì)每個(gè)方法每個(gè)屬性的要求,填上里面的代碼,一開(kāi)始就必須知道文件的高度,寬度,由于php處理不同類型的圖片使用的函數(shù)不同,我們?cè)谶@里不得不知道文件類型是多少。以決定用哪個(gè)函數(shù) 設(shè)計(jì)類的時(shí)候,才是思考“怎么做”的時(shí)候,要在實(shí)例化之后,馬上知道寬高。一定是在構(gòu)造函數(shù)里完成的,只有構(gòu)造函數(shù)會(huì)在類實(shí)例化的時(shí)候執(zhí)行,這里我們可以使用 getimagesize 函數(shù),取得文件的寬度,高度,類型 ,寬度和高度,我們可以在這里,賦值給屬性。這樣一來(lái),實(shí)例化圖片,就得到屬性的問(wèn)題就解決了,那改變大小的過(guò)程呢?
<?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) {
}
}
由于網(wǎng)絡(luò)上常用的圖片類型有g(shù)if jpg png 三種,其他的類型暫時(shí)不做考慮,調(diào)整大小的方法。在輸出之前是什么也不做的??梢哉f(shuō),我們的代碼,只要知道要輸出的圖片是多大就可以了 但是,不同的方法,內(nèi)部變量不通用。怎么辦注冊(cè)全局變量容易被外部變量干擾和污染,那我們就利用類的屬性來(lái)保存。新加兩個(gè)屬性這里暫定為w和h,這兩個(gè)屬性,嚴(yán)格來(lái)說(shuō)不是屬性,只是我們利用屬性來(lái)在方法之間傳遞變量而已,為了避免它們?cè)陬惖耐獠勘辉L問(wèn)和修改我們?cè)诙x的時(shí)候使用關(guān)鍵字私有來(lái)進(jìn)行訪問(wèn)限制,private $w = 0;private $h = 0;
public function size($width, $height) {
$this->w = $width;
$this->h = $height;
}
改變大小的方法,只要暫時(shí)把要輸出的寬度和高度記下來(lái)就可以了。 下面就是保存了,要保存之前,得先把圖片弄小了才行,所以,縮略圖的計(jì)算過(guò)程,主要在這里完成,需要載入原圖才能縮小,而且,也要知道文件類型才行 ,因?yàn)椴煌愋偷膱D片載入方式是不同的,文件名和文件類型。在構(gòu)造函數(shù)才知道,此時(shí)我們?cè)偌尤雰蓚€(gè)公共屬性,
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];
}
之后,我們可以在保存的方法里,載入原圖,改變大小,并保存到指定的位置上,至于保存方法的書(shū)寫(xiě)不同的類型調(diào)用的函數(shù)時(shí)不同的可以選擇使用switch ($var[2])進(jìn)行判斷 在進(jìn)行新建一個(gè)縮略圖然后保存。
//按這個(gè)類的編寫(xiě)方式。。使用方法應(yīng)該是這樣
$simg = new simg("1.jpg");
//讀取寬高并計(jì)算
$simg->width
//設(shè)置大小
$simg->size(200, 200);
//保存到
$simg->save("2.jpg");
和描述有點(diǎn)不一樣 ,因?yàn)槊枋鍪牵菏褂茫ㄟ@個(gè))大小,另存為(這里)這個(gè)描述有點(diǎn)繞口,如果可以這樣寫(xiě)就沒(méi)問(wèn)題了$simg->size(200, 200)->save("2.jpg");對(duì)象的使用必須是這樣的對(duì)象->方法()這就要求前面的量里的值必須是一個(gè)對(duì)象,save前面是size這就要求size的返回值必須是一個(gè)對(duì)象,但是這個(gè)方法沒(méi)有什么東西需要返回,而且這個(gè)對(duì)象肯定是當(dāng)前對(duì)象,才會(huì)有save方法,沒(méi)有對(duì)象不要緊我們自己添加一個(gè),
public function size($width, $height) {
$this->w = $width;
$this->h = $height;
return $this;
}
返回當(dāng)前的對(duì)象,這樣就可以用圖片 使用(這個(gè))大小,另存為(這里)$simg->size(200, 200)->save("2.jpg");這樣一個(gè)符合oop思想的類封裝完成了。
- PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記(三) - 單例模式和工廠模式
- PHP高級(jí)對(duì)象構(gòu)建 工廠模式的使用
- php中類和對(duì)象:靜態(tài)屬性、靜態(tài)方法
- PHP面向?qū)ο蟮倪M(jìn)階學(xué)習(xí)(抽像類、接口、final、類常量)
- php使用變量動(dòng)態(tài)創(chuàng)建類的對(duì)象用法示例
- php判斷對(duì)象是派生自哪個(gè)類的方法
- 詳解php中的類與對(duì)象(繼承)
- PHP入門教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類,抽象方法等)
- PHP實(shí)現(xiàn)基于面向?qū)ο蟮膍ysqli擴(kuò)展庫(kù)增刪改查操作工具類
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之類常量用法實(shí)例
- php對(duì)象工廠類完整示例
相關(guān)文章
Smarty模板常見(jiàn)的簡(jiǎn)單應(yīng)用分析
這篇文章主要介紹了Smarty模板常見(jiàn)的簡(jiǎn)單應(yīng)用,結(jié)合實(shí)例形式分析了Smarty模板的引入、創(chuàng)建、設(shè)置及相關(guān)的常見(jiàn)使用技巧,需要的朋友可以參考下2016-11-11
老生常談PHP數(shù)組函數(shù)array_merge(必看篇)
下面就為大家?guī)?lái)一篇老生常談PHP數(shù)組函數(shù)array_merge(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
ThinkPHP使用Smarty第三方插件方法小結(jié)
這篇文章主要介紹了ThinkPHP使用Smarty第三方插件方法,結(jié)合實(shí)例形式總結(jié)分析了ThinkPHP使用Smarty模板的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-03-03
Laravel中重寫(xiě)資源路由自定義URL的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Laravel中重寫(xiě)資源路由自定義URL的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-08-08
微信公眾平臺(tái)開(kāi)發(fā)之配置與請(qǐng)求
微信公眾平臺(tái)是騰訊公司在微信的基礎(chǔ)上新增的功能模塊,通過(guò)這一平臺(tái),個(gè)人和企業(yè)都可以打造一個(gè)微信的公眾號(hào),并實(shí)現(xiàn)和特定群體的文字、圖片、語(yǔ)音的全方位溝通、互動(dòng)。本文給大家介紹微信公眾平臺(tái)開(kāi)發(fā)之配置與請(qǐng)求,需要的朋友可以參考下2015-08-08
smarty學(xué)習(xí)筆記之常見(jiàn)代碼段用法總結(jié)
這篇文章主要介紹了smarty學(xué)習(xí)筆記之常見(jiàn)代碼段用法,結(jié)合實(shí)例形式總結(jié)分析了Smarty常見(jiàn)代碼段的含義與使用方法,需要的朋友可以參考下2016-03-03
PHP中針對(duì)區(qū)域語(yǔ)言標(biāo)記信息的操作
大家都知道Locale 類就是操作區(qū)域語(yǔ)言相關(guān)內(nèi)容的,它無(wú)法被實(shí)例化,所有全部功能方法都是靜態(tài)的。接下來(lái)通過(guò)本文給大家分享PHP中針對(duì)區(qū)域語(yǔ)言標(biāo)記信息的操作,需要的朋友參考下吧2021-07-07
laravel框架關(guān)于搜索功能的實(shí)現(xiàn)
本文是作者整理的關(guān)于laravel框架搜索功能的實(shí)現(xiàn)原理,并附上了詳細(xì)代碼,有需要的小伙伴請(qǐng)持續(xù)關(guān)注!2018-03-03

