這一篇與上一篇隔的時間有點長啊,並且中間還插入了一個小項目。不過沒關係,《邊記邊學PHP》還會一直進行去。
PHP物件導向編程
(2)類屬性
所謂類屬性,就是在類裡面聲明的變數。它與在類外面聲明的變數的區別就是前面加上了修飾許可權,也就是上一篇中的public/private/protected。比如我要聲明一個學生類,裡麵包含學生的學號,姓名,性別,年齡,班級等。那麼我可以如下聲明:
sid;}public getName(){return $this->name;}public getGender(){return $this->gender;}public getAge(){return $this->age;}public getGrade(){return $this->grade;}public setSid($sid){$this->sid = $sid;}public setName($name){$this->name = $name;}public setGender($gender){$this->gender = $gender;}public setAge($age){$this->age = $age;}public setGrade($grade){$this->grade = $grade;}}
在上面的學生類中,我聲明了五個屬性,全部聲明成了private私人型,那麼在類的外面是不能直接存取他們的,所以我為它們每個屬性提供了兩個方法,分別是去訪問他們和設定它們的值。一般在聲明類的時候,屬性聲明成私人,而成員方法聲明成公有,那麼外面就能通過公有方法去訪問私人屬性了。並且在聲明訪問和設定兩個方法的時候一般使用getXXX()和setXXX()這種形式,XXX第一個字母一般大寫。當然也可以聲明成公有屬性,那麼在類外就可以直接給它們賦值,並且訪問了。但是還是建議聲明成私人屬性,因為以後如果規範了的話,每一個類會單獨生命成一個php檔案,專門存放這個類,聲明成私人的會保證這個類的對象裡面的值不會隨意更改,保證了安全性。
在聲明屬性的同時,也可以像類外變數一樣,聲明的同時賦值。
這裡注意:
屬性可以儲存一個值,一個數組,甚至是另一個類的對象。比如上面的學生類中給他添加學校屬性,這個學校也是一個類,包括學校的名字,地址等。我首先聲明學校類
class School{private $name;private $address;public getName(){return $this->name;}public getAddress(){return $this->address;}public setName($name){$this->name = $name;}public setAddress($address){$this->address = $address;}} 那麼我在學生類中就可以這麼加入學校屬性:
school;}...public setSchool($school){$this->school = $school;}} 這樣看起來與其他屬性一樣,但是在給他賦值傳參的時候注意傳的是對象。比如:
我先聲明一個學校:
$school1 = new School();$school1->setName("大連理工大學");$school1->setAddress("大連");$stu1 = new Student();$stu1->setSchool($school1); 這樣在訪問它的學校的時候就是一個對象了,如果我想知道這個學生的所在的學校名稱,我就要這麼訪問:
$stu1->getSchool()->getName();
使用getSchool方法得到的是一個School對象,那麼在使用School對象中的getName方法訪問它的名字。
這裡在類裡面訪問變數的時候,使用了$this這個關鍵字,那麼接下來就說一下this關鍵字。
(3)$this關鍵字
不管是聲明成公有還是私人還是保護的成員變數,在類裡面訪問自己的變數一定會有的,那麼就要用到$this關鍵字。$this關鍵字在我看來就是指類自己本身,我也可以理解成自己把自己當成了一個對象去調用自己的屬性。這裡注意,在聲明變數的時候我們使用了$符號,但是如果使用$this訪問的時候,只有this加$符號,後面的屬性就不要加了,如果加上會報錯。具體用法還是參照上面的代碼。當然如果是外面聲明的對象調用的時候跟$this一樣,對象要加$符號,後面不加。
(4)靜態屬性
對於靜態屬性我沒有想到怎麼去解釋它,不過我看到書上這句話說得很好:靜態屬性常用來表示一個與某個特定類有關而與執行個體對象無關的持續值。我們可以把靜態屬性看成是累得全域變數。靜態屬性的一個重要特性是,訪問靜態屬性時不需要建立類的執行個體,即不需要定義類的對象。
在書上舉了一個車類裡面的銷售數量的靜態屬性,也就是說不管是誰買的車,反正是賣了,那麼我的銷售數量就要加1。但是我上面已經舉了學生與學校的例子,我就再接著我的例子說,我想到了一個學校畢業生的這個屬性,也就是說不管你是誰,只要從我的學校畢業了,那麼我的學校畢業生的人數就會多1。那麼我可以這麼聲明:
public static $graduate;
也就是在變數的前面加上static這個關鍵字。那麼我在訪問這個靜態屬性的時候就不要使用對象去訪問了,直接使用這個類去訪問,School::$graduate = ...;就可以了。這也就是上面說的不需要定義類的對象可以去訪問。這裡我可以用張圖來說明靜態屬性與普通屬性的區別:
靜態屬性只佔這個記憶體,不管存不存在對象執行個體,除非這個類沒了,否則會一直佔有自己的記憶體。而普通的屬性在每次聲明對象的時候都會分配記憶體。
靜態屬性一般聲明成公有的。
(6)類常量
與類外的普通常量一樣,類常量也是儲存一個固定的值。使用const關鍵字進行聲明,這裡不需要加許可權修飾。在訪問的時候跟訪問靜態屬性一樣需要使用類名::(雙冒號)加常量名來訪問。比如如果我聲明一個手機類,手機有各種型號,那麼我可以把各個手機型號用常量來儲存,在給手機型號屬性賦值的時候使用這些常量來賦值就好了。但是可能有這種疑惑,為什麼要使用常量,我直接聲明不就行了。那麼可以這樣理解:
class Phone{const IPHONE = 1;const ZTE = 2;const HUAWEI = 3; //這裡面各種屬性}我這個是一個手機類,裡面聲明了三個常量,這裡注意,聲明常量不需要$符號,並且常量的名字一般大寫。但是你注意我在裡面儲存的是int型的資料,如果我給手機型號賦值的時候雖然給他賦值是類似:$this->type = ZTE;但是我的型號存的是int型的資料,那麼就會佔記憶體少,如果我不適用常量$this->type = 'ZTE';這樣我就存的字串。並且使用常量可以提高編譯速度。
這是我理解的常量的優點。但是我沒怎麼用過。
下一篇繼續物件導向。
以上就介紹了邊記邊學PHP-(十二)物件導向編程2,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。