2019-07-23 类的封装性

类的封装性,简单来说就是在属性和方法前加了一个限定词,在php中有三个限定词:public(公共的)、protected(被保护的)、private(私有的),如果属性前加了任何一个限制词var要省略。它们具体有什么区别呢?它们的关系又是什么呢?下面做一个解析。

首先来看一个表格:

 
  public protected private
类中 可以被访问 可以被访问 可以被访问
类外 可以被访问    
子类 可以被访问 可以被访问  

上面的表格已经可以让我们对这三个属性做一个清楚地认知,下面通过实例简述:

1.public(公共的)

class Person{
    public $name;
    public $age;
    public $sex;

    public function say()
    {
        echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
    }
}

$obj = new Person();
$obj->name = "ZhangSan";
$obj->age = "20";
$obj->sex = "male";
$obj->say();

输出结果为:My name is ZhangSan. I am 20 years old.male in sex.

//继承
class Student extends Person{

    public function sing()
     {
         echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
     }
}

$obj1 = new Student();
$obj1->name = "ZhangSan";
$obj1->age = "20";
$obj1->sex = "male";
$obj1->sing();

输出结果为:My name is ZhangSan. I am 20 years old.male in sex.

可以看到,无论是在外部还是在继承中,public 属性都可以被访问到。还要注意一点,如果不加任何限定词,默认限定词即为public。

2.protected(受保护的)

我们把上个例子当中的方法设为受保护的,试一下在类外能否被访问到:

class Person{
    public $name;
    public $age;
    public $sex;

    protected function say()
    {
        echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
    }
}

$obj = new Person();
$obj->name = "ZhangSan";
$obj->age = "20";
$obj->sex = "male";
$obj->say();

输出结果是会报错:Fatal error: Call to protected method Person::say() from context ‘‘;提示我们在类外是不能访问受保护的方法的。

class Person{

    protected function say()
     {

         echo "我是父类";
     }
}

//子类继承父类
class Student extends Person{
    function sing()
    {
        //调用父类受保护的方法
        echo $this->say();
    }
}

$obj = new Student();
$obj->sing();

输出结果为:我是父类。说明继承的子类可以调用父类中受保护的方法。

3.private(私有的)

看名字我们就大概可以看到,这个限制词把属性和方法限制成类私有的,所以在类外部和子类中都是不可访问的。

class Preson{

    private function say(){
        echo "我是父类";
    }
}

$obj = new Preson();
$obj->say();

输出结果为报错:Fatal error: Call to private method Preson::say() from context ‘‘;

在继承中怎么样呢?

class Preson{

    private function say(){
        echo "我是父类";
    }
}

class Student extends Preson
 {
     function sing()
      {
          echo $this->say();
      }
 }

$obj = new Student();
$obj->sing();

输出结果为报错:Fatal error: Call to private method Preson::say() from context ‘‘;

子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

原文地址:https://www.cnblogs.com/zhangxu-fasu/p/11232587.html

时间: 2024-11-05 18:50:42

2019-07-23 类的封装性的相关文章

转载 实现类的封装性

实现类的封装性 为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问.对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值.一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容.我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另

类的封装性和继承

面向对象思想已经存在了好多年了,PHP之前没有面向对象,是PHP开发者后期加上的.面向对象思想有三大特征,封装,继承,多态,其中多态并不适用于PHP.之前使用的是public关键词,它的意思是公开的,意思就是只要拿到这个类,谁都可以使用,谁都可以赋值调用,重新赋值调用.封装:即禁止某些方法/属性 ,不充许外部调用.并开放部分方法 ,来间接调用.比如 银行的 ATM, 你可以输入密码 " 检测 " 用户的密码是否正确, 但不能 " 查询 " 用户的密码.代码 : 1

类的封装性和信息隐蔽—类声明和成员函数定义的分离

在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率. 由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象.由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数.为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中. 例如,可以分别写两个文件: //student.h

java面向对象基础 封装性

对于刚学习java的人来说可能不知道 封装性的好处,感觉麻烦,封装有很多好处.最主要的目的就是 保护内容.保证某些属性或者方法不被外部看见. 类的封装性即不能让外面的类随意修改一个类的成员变量: 在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用: 为实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问.对一个变量的操作,一般都有 读取和赋值操作,我们一般定

Java——类的封装、继承与多态

一.类和对象 1.类 类是数据以及对数据的一组操作的封装体. 类声明的格式: 类声明 { 成员变量的声明: 成员方法的声明及实现: } 1.1 声明类 [修饰符] class 类<泛型> [extends 父类] [implements 接口列表] <泛型>——类的参数,带有参数的类成为泛型类. 1.2 声明成员变量和成员方法 成员变量声明格式:[修饰符] 数据类型 变量[=表达式]{,变量[=表达式]}: 成员方法——用来描述对成员变量进行的操作,格式:[修饰符] 返回值类型 方

vb.net和C#两兄弟谁的封装性更好?

引言: 虽然没怎样接触过vb.net,但是大概对于vb6还是比较了解的.前者是从后者基础上发展而来的.后来接触了C#编程语言,起初没有太关心她和vb.net有啥不同的地方,话说都是面向对象的,而且都是MS帝国的产品.一直觉得没什么区别,直到昨天的下午……我才发现这样一个吊炸天的问题……原来vb.net她……竟然…… 最近看一些博客发现,也发一些vb6.0论坛,vb.net论坛等比较冷清,更多的人从过去的vb6.0和vb.net选择转向了C#……刚好也和我昨天的发现不谋而合. 下面是我的一点小小的

Python 基础之面向对象初识与类的封装

一: 面向对象类的初识#(1) 类的定义#三种方式:#1.class MyClass:    pass #2.推荐class MyClass():    pass #3.class MyClass(object):    pass#(2) 类的实例化class MyClass():    pass#类的实例化,实例化对象obj = MyClass() #obj 就是一个对象#(3)类的基本结构只有成员方法和成员属性对象.属性  对象.方法()#例:class MyClass():    #成员属

验证码确保php无输出、sql语句的封装性、文件上传的工具类【这三个重点工具类实现】

1.php代码在引入中不会进行结束或者确保结束之后没有空格,来保证php在被包含中没有被输出[防止header和session_start()对输出的控制]实质上,需要注意的就是,要不就进行输出缓存控制以及php开始标签前没有空格 验证码这个功能需要header和session两个功能[尤其需要注意输出的问题] [总结:防止php代码中带着一些输出的问题](1)在php标签中开始<?php 前顶格(2)php结束符要不不写,写了就不要在结束之后还有换行[防止该文件被包含之后提前出线输出](3)或

体验Java的封装性

1 package com.cnblogs.java; 2 //体验Java的封装性 3 /* 4 * 如下的人类年龄赋值-300岁,显然很不合理,这种直接对类的属性赋值,有时候虽然不合理但却会编译通过. 5 * 所以我们考虑不让对象直接操作属性,而是通过对象调用方法来对属性赋值,在方法中我们就可以进一步限制 6 * 赋值的大小问题. 7 * 解决办法:将类的属性私有化,通过共有的方法来调用修改类的属性.(在方法中限制修改的值) 8 */ 9 public class TestPerson {