首頁  >  文章  >  後端開發  >  邊記邊學PHP-(十二)物件導向程式設計2

邊記邊學PHP-(十二)物件導向程式設計2

WBOY
WBOY原創
2016-08-08 09:32:30813瀏覽

這篇與上一篇隔的時間有點長啊,並且中間還插入了一個小項目。不過沒關係,《邊記邊學PHP》還會一直進行去。

PHP物件導向程式設計

(2)類別屬性

所謂類別屬性,就是在類別中宣告的變數。它與在類別外宣告的變數的差別就是前面加上了修飾權限,也就是上一篇的public/private/protected。例如我要聲明一個學生類,裡麵包含學生的學號,姓名,性別,年齡,班級等。那我可以如下聲明:

<?php
class Student{
	private $sid;
	private $name;
	private $gender;
	private $age;
	private $grade;

	public getSid(){
		return $this->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;
	}
}
那麼我在學生類中就可以這麼加入學校屬性:

<?php
class Student{
	...
	private $school;

	...
	public getSchool(){
		return $this->school;
	}

	...
	public setSchool($school){
		$this->school = $school;
	}

}
這樣值

<span style="white-space:pre">	</span>$school1 = new School();
<span style="white-space:pre">	</span>$school1->setName("大连理工大学");
<span style="white-space:pre">	</span>$school1->setAddress("大连");
<span style="white-space:pre">	</span>$stu1 = new Student();
<span style="white-space:pre">	</span>$stu1->setSchool($school1);
這樣值參的時候注意傳的是對象。例如:

我先聲明一個學校:

<span style="white-space:pre">	</span>$stu1->getSchool()->getName();

我先聲明一個學校:

<span style="white-space:pre">	</span>public static $graduate;

這樣在訪問它的學校的時候就是一個對象了,如果我想知道這個學生所在的名稱,我所在的學校名稱,我的學校就知道這個學生要這樣訪問:

class Phone{
	const IPHONE = 1;
	const ZTE = 2;
	const HUAWEI = 3;

    //这里面各种属性

}

     使用getSchool方法得到的是一個School對象,那麼在使用School物件中的getName方法存取它的名字。         這裡在類別裡面存取變數的時候,使用了$this這個關鍵字,那麼接下來就說一下this關鍵字。

(3)$this關鍵字

不管是聲明成公有還是私有還是保護的成員變量,在類裡面訪問自己的變量一定會有的,那麼就要用到$this字。 $this關鍵字在我看來就是指類自己本身,我也可以理解成自己把自己當成了一個物件去呼叫自己的屬性。這裡要注意,在宣告變數的時候我們使用了$符號,但是如果使用$this存取的時候,只有this加$符號,後面的屬性就不要加了,如果加上會報錯。具體用法還是參照上面的代碼。當然如果是外面宣告的物件呼叫的時候跟$this一樣,物件要加$符號,後面不加。

(4)靜態屬性

對於靜態屬性我沒有想到怎麼去解釋它,不過我看到書上這句話說得很好:靜態屬性常用來表示一個與某個特定特定類別有關而與實例物件無關的持續值。我們可以把靜態屬性看成是累得全域變數。靜態屬性的一個重要特性是,在存取靜態屬性時不需要建立類別的實例,也就是不需要定義類別的物件。

🎜🎜🎜在書上舉了一個車類裡面的銷售數量的靜態屬性,也就是說不管是誰買的車,反正是賣了,那麼我的銷售數量就要加1。但我上面已經舉了學生與學校的例子,我就再接著我的例子說,我想到了一個學校畢業生的這個屬性,也就是說不管你是誰,只要從我的學校畢業了,那麼我的學校畢業生的人數就會多1。那我可以這麼聲明:🎜🎜🎜rrreee🎜🎜🎜也就是在變數的前面加上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教程有兴趣的朋友有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn