具體概念講出來,感覺也不知道說的是什麼.其實就是
在類的成員屬性和成員方法前面,加上類似public protected private 的修飾符
目的:盡量地隱藏對象的內部細節,達到訪問控制.[不是拒絕訪問]. (對外形成一個屏障,只保留有限的對外接口與外部發生聯系.)
2.封裝的原則:
對象對外的部分不能夠隨意存取對象的內部數據(成員屬性和成員方法),從而有效地避免了外部錯誤對它的"交叉感染",使軟件錯誤能夠局部化,大大減小查錯和排錯的難度.
3.修飾符public protected private
public :公有的,默認的 protected :受保護的 private :私有的
4.訪問范圍
是否可以訪問對應的屬性和方法
public protected private 類的外部 √ × × 類的內部 √ √ √
①類的外部只有公有屬性和方法才可以訪問.
②其他屬性和方法可以在類的內部聲明公有方法間接地進行訪問.
③在類的內部可以訪問公有,私有,受保護的屬性和方法.
④在類的內部不可以訪問私有和受保護的屬性和方法.
如果成員方法沒有任何訪問控制符,默認是public的,在任何地方都可以訪問.(在對象外部就可以公有方法作為訪問接口,間接地訪問對象的內部細節).
引出這幾個魔術方法,首先要說一下,構造方法__construct()沒有加關鍵字修飾,是公有方法(構造方法不要設置成私有的權限)用戶可以使用構造方法在實例化對象後為私有屬性賦初始值.
但是,我們已經實例化對象,在程序運行過程中想要對私有屬性進行賦值操作.有兩種方法
(1).在類的內部設置公有方法,專門來提供賦值,取值接口
class Person{ private $name="紫籐"; public function __construct(){ echo $this->name; } //賦值方法 public function setvalue($name){ $this->name=$name; } public function getvalue(){ echo $this->name; } } //實例化 $mod = new Person();
結果是: 紫籐
$mod->setvalue('寶強'); $mod->getvalue();
結果是:寶強
(2)魔術方法__set(),__get(),__isset(),__unset()
如果像上面的每次都要去設置公有方法,很繁瑣.在php5.1.0之後的版本中,預定義了__set(),__get(),用來完成對所有非公有屬性都能獲取和復制的操作.
__set($propertyName,$propertyValue)
有兩個參數, 屬性名 和 屬性值,在給非公有屬性賦值時,會自動調用此方法(就是說在類中必須聲明__set()) (代碼後面補充)
__get($propertyName)在獲取非公有屬性的值時,會自動調用此方法.
檢測非公有屬性是否存在__isset(),刪除一個對象的非公有屬性__unset().為了防止用戶主動調用這兩個方法,要使用private關鍵字封裝在對象中.
__isset($propertyName)檢測非公有屬性是否存.(這是一個輔助檢測函數,沒有檢測功能),還要在外部調用isset()函數時,才會自動調用此方法.
__unset($propertyName)刪除一個對象的非公有屬性_,要在外部調用unset()函數時,才會自動調用此方法.