1. 程式人生 > >對象的封裝特性

對象的封裝特性

code private 屬性 而是 int protect ted 使用 autumn

四、對象的封裝特性

  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();

對象的封裝特性