對象的封裝特性
四、對象的封裝特性
1)什麽是封裝?
就是將對象的成員隱藏起來,不讓其直接在類的外部訪問,要通過一定的方法對封裝起來的成員進行訪問控制;
面向對象的封裝特性並不是不讓成員被訪問,而是要對其進行訪問控制;
2)修飾詞
var 公有的(過時)
可以在類的外部直接通過對象訪問(賦值和輸出);在類的內部可以通過$this來進行訪問;
public 公有的
等同於var;既可以修飾成員屬性,又可以修飾成員方法;public修飾的成員在類的外部可以使用對象來調用,在類的內部使用$this進行訪問;成員方法如果沒有修飾詞,默認為public修飾;
protected 受保護的
protected修飾的成員在類的外部不允許直接通過類的對象訪問;protected修飾的成員在類的內部可以通過$this關鍵字來進行訪問;protected修飾的成員在子類當中可以使用;
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();
對象的封裝特性