public、private、protected/抽象類和接口/final、static、clone

1、public

可以在類內、類外被其他的類和對象調用。子類可以繼承和使用父類中所有的公共成員。

對於成員方法,如果沒有寫關鍵字,默認就是public。

2、private

只能在所屬類的內部被調用和修改,不可以在類外被訪問,即使是子類中也不可以。

3、protected

可以在本類和子類中被調用,其他地方則不可以被調用。


4、類的繼承

(1) class 子類名稱 extends 父類名稱{      }

(2) parents:: 父類的成員方法(參數);    //通過parent::關鍵字在子類中調用父類中的成員方法


5、抽象類和接口

抽象類和接口都是不能被實例化的特殊類。它們都是配合面向對象的多態性一起使用。

(1) 抽象類只能作爲其他類的父類來使用。

    abstract class 抽象類名稱{

                  //抽象類的成員變量列表

                  abstract function 成員方法1(參數);     

                  abstract function 成員方法2(參數);

    }

抽象類和普通類相似,包含成員變量、成員方法。兩者的區別在於:抽象類至少要包含一個抽象方法。抽象方法沒有方法體,其功能的實現只能在子類中完成。抽象方法也是使用abstract關鍵字來修飾。

抽象類和抽象方法主要應用於複雜的層次關係中,這種層次關係要求每一個子類都包含並重寫某些特定的方法。

(2)接口

繼承特性簡化了對象、類的創建,增加了代碼的可重用性。但PHP只支持單繼承。如果想實現多重繼承,就要使用接口。PHP可以實現多個接口。

interface 接口名稱{

        //常量成員                                      //接口中不能聲明變量,只能使用const關鍵字聲明爲常量的成員屬性

        //抽象方法                                      //成員方法必須是抽象方法

}//接口中所有成員必須具備public的訪問權限

接口之間可以使用extends實現繼承。

接口可以直接使用接口名稱在接口外去獲取常量成員的值。

在子類中繼承接口使用implements關鍵字。實現多個接口的繼承,每個接口之間使用逗號連接。

class 子類名 implements 接口1,接口2{        }

**既然通過子類繼承了接口中的方法,那麼接口中的所有方法必須都在子類中實現,否則PHP將拋出錯誤信息。


6、final關鍵字

被final修飾過的類和方法就是“最終的版本”,

final class class_name{

//..

}

說明該類不可以再被繼承,也不能再有子類。

final function method_name()

說明該方法在子類中不可以進行重寫,也不可以被覆蓋。


7、static關鍵字——聲明靜態類成員

靜態屬性和靜態方法不需要在被類實例化的情況下就可以直接使用。在對象被銷燬後,仍然保存被修改的靜態數據,以便下次繼續使用。

(1) 靜態屬性

靜態屬性就是使用static修飾的成員屬性,它屬於類本身而不屬於類的任何實例。它相當於存儲在類中的全局變量,可以在任何位置通過類來訪問。靜態屬性訪問的語法如下:

類名稱::$靜態屬性名稱

其中“::”被稱爲範圍解析操作符,用於訪問靜態成員、靜態方法和常量,還可以用於覆蓋類中的成員和方法。

如果要在類內部的成員方法中訪問靜態屬性,那麼在靜態屬性的名稱前加上操作符"self::"即可。

(2)靜態方法

靜態方法不受任何對象的限制,可以不通過類的實例化直接引用類中的靜態方法。

類名稱::靜態方法名稱([參數1,參數2,....])

同樣如果要在類內部的成員方法中引用靜態方法,那麼在靜態方法的名稱前加上操作符"self::"即可。

**在靜態方法中,只能調用靜態變量,而不能調用普通變量,普通方法則可以調用靜態變量。

8、clone關鍵字——克隆對象

使用clone克隆的對象與原對象沒有任何關係,它是將原對象從當前位置重新複製了一份,也就是相當於在內存中新開闢了一塊空間。

$克隆對象名稱=clone $原對象名稱;

對象克隆成功後,它們中的成員方法、屬性以及值是完全相同的。如果要爲克隆後的副本對象在克隆時重新爲成員屬性賦初始值,那麼就要用到魔術方法“__clone()”。

“__clone()”自動包含$this和$that兩個對象的引用,$this是副本對象的引用,$that是原本對象的引用。

<?php
class Book{							//類Book
	private $object_type = 'book';				//聲明私有變量$object_type,並賦初值爲book
	public function setType($type){				//聲明成員方法setType,爲變量$object_type賦值
		$this -> object_type = $type;
	}
	public function getType(){				//聲明成員方法getType,返回變量$object_type的值
		return $this -> object_type;
	}
	public function __clone(){				//聲明__clone()方法
		$this ->object_type = 'computer';	//將變量$object_type的值修改爲computer
	}
}
$book1 = new Book();						//實例化對象$book1
$book2 = clone $book1;						//使用普通數據類型的方法給對象$book2賦值
echo '對象$book1的變量值爲:'.$book1 -> getType();	//輸出對象$book1的值
echo '<br>';
echo '對象$book2的變量值爲:'.$book2 -> getType();
?>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章