iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Software Development

PHP 語法通關系列 第 22

Day22 類別與物件--魔術方法2 及 封裝private

  • 分享至 

  • xImage
  •  

物件導向的封裝特性

封裝特性:在一個物件產生之後,物件的部分成員屬性和成員方法在邏輯上是不允許在物件外部調用或者使用的

  • 封裝關鍵字:private 私有的
    • 特徵:
         1. 被private修飾的成員屬性、成員方法不能夠在類的外部進行訪問,只可以在類的內部訪問。
         2. var和private只能選取一個(public 和 protected)
    1. 魔術方法 __get()
    • 觸發時機:獲得一個類的成員變數時呼叫,訪問私有成員屬性的時候自動觸發
    • 功能:1.防止報錯,2.為私有成員屬性訪問提供後門
    • 參數:1個..訪問的私有成員屬性名稱
    • 返回值: 可有可沒有
<?php
class Bear
{
    private $name = 'Winnie';
    private $sex = '女';
    var $flag = true;
    //成員方法
    function sayHi()
    {
        echo 'HIHI~ Hello World ';
    }

    function eat()
    {
        echo '魚好吃!';
    }

    function hunter()
    {
        echo '我是一隻熊,我會捕魚,話說,西索很帥!';
    }
    //魔術方法 __get()
    function __get($pro)
    {
        // echo '#########';
        // echo $this->name;
        // return $this->$pro;
        if ($pro == 'name') {
            return $this->name;
        } else {
            return $this->$pro . '禁';
        }
    }
}
//實例化對象
$animal = new Bear();
var_dump($animal);
echo $animal->name; //Fatal error 不能訪問
echo '<hr/>';
$animal->name = '哈哈哈';//也不行
var_dump($animal);
    1. 魔術方法 __set()
    • 觸發時機:設定一個類的成員變數時呼叫,對私有成員屬性進行設置值得時候自動觸發
    • 功能:1.屏蔽錯誤,2.為私有成員屬性設置值
    • 參數:2個。 1個私有成員屬性名。 2個要設置的新值。
    • 返回值:無
    1. 魔術方法 __isset()
    • 觸發時機:對私有成員屬性進行isset檢查時自動觸發
    • 功能:代替物件外部的isset函數檢查,返回結果
    • 參數:1個,私有成員屬性名
    • 返回值:一般返回isset()檢查的結果
    1. 魔術方法:__unset()
    • 觸發時機:在物件外部對私有成員屬性進行unset操作時自動觸發。
    • 功能:代替物件外部的unset操作
    • 參數:1個 私有成員屬性名
    • 返回值:無
<?php
class BearPerson
{
    //成員屬性
    var $name = 'Winnie';
    private $sex = '女';
    private $age = 18;
    //成員方法
    function sayHi()
    {
        echo '吉祥如意~';
    }
    function hunter()
    {
        echo '捕到魚嘩啦啦啦啦啦~~~';
    }
    //魔術方法
    function __set($pro, $newVal)
    {
        //echo '########';
        // var_dump($pro);
        // var_dump($newVal);
        //$this->$pro = $newVal;
        if ($pro == 'sex') {
            $this->$pro = $newVal;
        } else {
            //沒有返回值
            //return '無權修改';
        }
    }
    //魔術方法 __isset
    function __isset($pro)
    {
        // echo '########';
        // var_dump($pro);
        return isset($this->$pro);
    }

    //魔術方法 __unset()
    function __unset($pro)
    {
        //echo '#########';
        //var_dump($a);
        if ($pro == 'sex') {
            unset($this->$pro);
        }
    }
}
//實例化一個對象
$bear = new BearPerson;
// var_dump($bear);
// //訪問私有成員屬性
// //echo $bear->sex;
// //設置私有成員屬性
// $bear->sex = '不男不女';
// var_dump($bear);

// echo $bear->age = 50;
// var_dump($bear);


//實例化一個對象 isset()
//檢查姓名屬性是否設置 非私有
// $result = isset($bear->name);
// var_dump($result);
//檢查私有成員屬性
// $result = isset($bear->age);
// var_dump($result);

//刪除一個屬性 unset() 非私有的
// unset($bear->name);
// var_dump($bear);
// echo $bear->name;

//刪除一個私有成員屬性
unset($bear->sex);
var_dump($bear);

上一篇
Day21 類別與物件--魔術方法construct and deconstruct
下一篇
Day23 類別與物件--繼承、常見關鍵字
系列文
PHP 語法通關30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言