对象的封装特性

四、对象的封装特性

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

原文地址:https://www.cnblogs.com/zhouwanqiu/p/9588737.html

时间: 2024-11-02 06:31:23

对象的封装特性的相关文章

python--面向对象之三个特性:封装、继承、多态

一.面向对象简介 1.面向对象不是所有的情况都适用2.面向对象编程 a.定义类 class 类名: def 方法1(self, 参数名): 方法体 b.根据类创建对象,使用对象去执行类中的方法 obj = 类名() obj.方法名3.self,形参,python内部传递 4.函数式编程与面向对象式编程的区别 示例: #!/usr/bin/env python # -*- coding:utf-8 -*- """ 面向对象编程初识 """ #先定义

c# 面相对象2-之封装性

c# 面相对象2-之封装性 一.封装特性: 这是一种隐藏的特性.可以用一个公式来展示类的封装特性: 封装的类=数据  +  对此数据进行的操作(即算法) 通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西. 在面向对象理论中,封装这个概念拥有更为宽广的含义.小到一个简单的数据结构,大到一个完成的软件子系统,静态的如某个软件系统要收集数据信息项,动态的如某个工作处理的流程,都可以封装到一个类中. 具备这种封装的意识,是掌握面向对象分析与设计技巧的关键 二.类的成员: 成员变量

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

leveldb.net对象读写封装

leveldb是一个非常高效的可嵌入式K-V数据库,在.NET下有着基于win实现的包装leveldb.net;不过leveldb.net只提供了基于byte[]和string的处理,这显然会对使用的时候带来不方便,毕竟在编写应用的时候都是希望通过对象的方式来存储,如我们常见的redis,mongodb和memcached等等都提供对象方式的读写.以下主要讲解leveldb.net基础上封装一层序列化功能方便使用. 制定对象化的访问接口 为了不修改leveldb.net的代码,所以选择在他基础过

返回对象result封装

import tf56.sofa.serializer.JsonGenerateUtil; /** * 返回对象Result封装 * @athor changmeng.liu * @date 2014-7-25 * @version 1.0 * @update */ public class Result { final String SUCCESS="success"; final String ERROR="error"; private String coun

JAVA实验4 类与对象(封装继承多态等机制的使用)

实验四 类与对象(封装.继承.多态等机制的使用) 实验内容: 1. 编写一个名为TwoDimensionalShape的抽象类,拥有属性area和circumference表示面积和周长,以及抽象方法getArea()和getCircumference(),用于获取面积和周长. 2. 编写Printable接口,包括一个抽象方法printShapeInfo,用于输出图形信息. 3. 分别编写Rectangle.Triangle.Circular三个类,用于描述矩形.三角形和圆形,要求继承于Two

24 jQuery——对象的封装、闭包、匿名自调用函数

对象的封装 有使用我们引入的js文件中的对象非常非常多,js一旦变量名重复就会覆盖.为了解决这一问题,我们使用对象封装. 我们引入的js工具(代码)不会覆盖我们自己写的对象.这是因为它使用了封装与闭包. 就好像java中引入的工具,虽然方法名和我们自己写的方法名重复,但并不会覆盖,因为我们在使用引入的方法时,通常在前面类名点方法名的形式. js也一样.js使用闭包封装好工具,只返回一个函数名,我们使用函数名.对象的方式调用提供的方法即可. 闭包 简单的理解为:函数里面有函数,返回函数中的函数对象

Golang-面向对象编程三大特性-继承、多重继承

Golang-面向对象编程三大特性-继承 继承基本介绍和示意图 继承可以解决代码复用,让我们的编程更加靠近人类思维. 当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体(比如刚才的Student),在该结构体中定义这些相同的属性和方法. 其它的结构体不需要重新定义这些属性(字段)和方法,只需嵌套一个 Student 匿名结构体即可. [画出示意图] 也就是说:在 Golang 中,如果一个 struct 嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和

Golang-面向对象编程三大特性-多态

Golang-面向对象编程三大特性-多态 基本介绍 变量(实例)具有多种形态.面向对象的第三大特征,在 Go 语言,多态特征是通过接口实现的.可以按照统一的接口来调用不同的实现.这时接口变量就呈现不同的形态. 快速入门 在前面的 Usb 接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态特性.[点明] 接口体现多态的两种形式 多态参数 在前面的 Usb 接口案例,Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态.