1、什麼是封裝?函數
就是將對象的成員隱藏起來,不讓其直接在類的外部訪問,要經過必定的方法對封裝起來的成員進行訪問控制;this
面向對象的封裝特性並非不讓成員被訪問,而是要對其進行訪問控制;spa
2、修飾詞code
var 公有的(過期)對象
能夠在類的外部直接經過對象訪問(賦值和輸出);在類的內部能夠經過$this來進行訪問;blog
public 公有的get
等同於var;既能夠修飾成員屬性,又能夠修飾成員方法;public修飾的成員在類的外部能夠使用對象來調用,在類的內部使用$this進行訪問;成員方法若是沒有修飾詞,默認爲public修飾;io
protected 受保護的function
protected修飾的成員在類的外部不容許直接經過類的對象訪問;protected修飾的成員在類的內部能夠經過$this關鍵字來進行訪問;protected修飾的成員在子類當中能夠使用;class
private 私有的
private修飾的成員在類的外部不容許直接經過類的對象訪問;private修飾的成員在類的內部能夠經過$this關鍵字來進行訪問;private修飾的成員在子類當中不能使用;
class Person{ //public聲明的成員屬性和成員方法能夠在類的外部直接調用,在類的內部也可訪問 //[成員屬性] public $name; private $sex; private $age; //[成員方法] function set($key,$val){ if($key=="sex"){ if($val==="男" || $val==="女" || $val==="保密"){ $this->sex=$val; }else{ echo "性別只能爲男、女或保密!"; } } if($key=="age"){ if(is_int($val) && 0<$val && $val<150){ $this->age=$val; }else{ echo "年齡只能爲0~150的整數!"; } } //return $this; } function info(){ echo "姓名:".$this->name.",性別:".$this->sex.",年齡:".$this->age; } } $person=new Person; $person->name="autumn"; $person->set("sex","男"); $person->set("age",25); //$person->set("sex","男")->set("age",25); $person->info();
3、魔術方法
①__set
參數:兩個(屬性的名稱、屬性的值)
觸發時機:當對受保護的成員屬性、私有的成員屬性、未定義的成員屬性進行賦值時會自動調用,而且將成員屬性的名稱傳遞給第一個參數,將成員屬性要賦的值傳遞給第二個參數;
做用:對受保護的、私有的、未定義的成員屬性進行賦值控制
②__get
參數:一個(接收要取值的屬性的名稱)
觸發時機:當對受保護的、私有的、未定義的成員屬性進行取值操做的時候會自動調用,而且將成員屬性的名稱傳遞給該方法;
做用:對受保護的、私有的、未定義的成員屬性進行取值控制
class Person{ //[成員屬性] public $name; private $sex; private $age; //[成員方法] function __set($key,$val){ //判斷要設置的成員屬性是否存在 if(!property_exists(__CLASS__, $key)){ echo $key." is not exists"; return false; } if($key=="sex"){ if($val==="男" || $val==="女" || $val==="保密"){ $this->sex=$val; }else{ echo "性別只能爲男、女或保密!"; } } if($key=="age"){ if(is_int($val) && 0<$val && $val<150){ $this->age=$val; }else{ echo "年齡只能爲0~150的整數!"; } } } function __get($proName){ if(!property_exists(__CLASS__, $proName)){ return $proName." is not exists"; } if($proName=="sex"){ return $this->sex; } if($proName=="age"){ return $this->age; } } function info(){ echo "姓名:".$this->name.",性別:".$this->sex.",年齡:".$this->age; } } $person=new Person; //name是公有的,能夠直接在類的外部訪問 $person->name="autumn"; //sex和age是受保護的或是私有的,會調用__set方法進行賦值 $person->sex="男"; $person->age=25; //name是公有的,能夠直接輸出該屬性的值 echo $person->name; //sex和age是受保護的或是私有的,不能直接在類的外部訪問,會調用__get獲取屬性的值 echo $person->sex; echo $person->age; var_dump($person);
③__isset
參數:一個(屬性的名稱)
觸發時機:當對受保護的、私有的、未定義的成員屬性進行isset或empty函數進行判斷的時候自動調用;
做用:對受保護的、私有的、未定義的成員屬性進行isset或empty的判斷控制
注意:要有返回值、返回值爲true或false
④__unset
參數:一個(屬性的名稱)
觸發時機:當對受保護的、私有的成員屬性進行unset銷燬的時候自動調用,並將屬性的名稱以參數的形式傳遞
做用:對受保護的、私有的成員屬性進行unset控制
class Person{ //[成員屬性] public $name="autumn"; protected $sex="男"; private $age=25; //[成員方法] function __isset($proName){ if($proName=="sex"){ return true; } if($proName=="age"){ return true; } } function __unset($proName){ if($proName=="sex"){ unset($this->sex); } if($proName=="age"){ unset($this->age); } } function info(){ echo "姓名:".$this->name.",性別:".$this->sex.",年齡:".$this->age; } } $person=new Person; var_dump(isset($person->name));//不會調用__isset() echo "<hr>"; var_dump(empty($person->name));//不會調用__isset() echo "<hr>"; var_dump(isset($person->sex));//自動調用__isset() echo "<hr>"; var_dump(empty($person->sex));//自動調用__isset() echo "<hr>"; var_dump(isset($person->age));//自動調用__isset() echo "<hr>"; var_dump(empty($person->age));//自動調用__isset() echo "<hr>"; unset($person->name);//不會調用__unset() unset($person->sex);//自動調用__unset() unset($person->age);//自動調用__unset() $person->info();