具體概念講出來,感覺也不知道說的是什麼.其實就是
在類別的成員屬性和成員方法前面,加上類似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()函數時,才會自動呼叫此方法.