Day22 类别与物件--魔术方法2 及 封装private

物件导向的封装特性

封装特性:在一个物件产生之後,物件的部分成员属性和成员方法在逻辑上是不允许在物件外部调用或者使用的

  • 封装关键字: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);

<<:  图的储存结构 - 相邻多重串列 - DAY 23

>>:  Day 22 - 物件导向与向量3 - class + mouseInpress 设定

Python 语言

https://wolkesau.medium.com/python-语言-57370c0adcf7...

Flutter体验 Day 5-Widget 乐高积木

Widget乐高积木 在开始实作App之前,我们需要认识 Flutter 程序架构的基本概念。 回顾...

Day 11 - Algebraic Data Types

yo, what's up? Product Type Product types 允许同时存在两种...

NNI搬到Colab的优劣

如同上一章节所述,整个过程几乎和在本机安装、验证及执行类似。但是,在本机和Colab执行各有其优缺点...

如何使用 Github Actions 自动部署 Angular 到 Github Pages

Github 多了一个 Actions 的新功能,当 push 档案到 Github 的时後,就会自...