类型的访问控制通过使用修饰符允许开发人员对类中成员的访问进行限制。这是PHP5的新特性,也是OOP语言中的重要特性,大多数OOP语言都已支持此特性。PHP5支持如下三种访问修饰符,在类的封装中我们已经介绍过了两种。在这里总结一下,访问控制修饰符包括public(公有的、默认的)、privat(私有的)和protected(受保护的)三种哦。他们的作用及其之间的区别如下表所示:

①公有的访问修饰符public

使用这种修饰符则类中的成员将没有访问限制,所有的外部成员都可以访问这个类中的成员,在PHP5之前的所有版本中,PHP中类的成员都是public的。

②私有的访问修饰符private

当类中的成员被定义为private,对于同一个类里所有成员都没有访问限制,但对于该类的外部代码是不允许改变甚至操作的,对于该类的子类,也不能访问private修饰的成员。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    //声明一个类作为父类使用,将它的成员都声明为私有的
    class MyClass {
        private $var1=100;
 
        private function  printHello(){
            echo "hello<br>";    
        }
    }
 
    //声明一个Myclass类的子类师徒访问父类中的私有成员
    class MyClass2 extends MyClass{
        function useProperty(){
            echo "输出从父类继承过来的成员属性值".$this ->var1."<br>";
            $this ->printHello();
        }
    }
 
    $subObj = new MyClass2();
    $subObj -> useProperty();       //调用子类对象中的方法实现对父类私有成员的访问
?>

在上面的代码中声明了一个类MyClass,在类中声明了一个私有的成员属性和一个私有的成员方法,又声明了一个类MyClass2继承类MyClass,并在子类MyClass2中访问父类中的私有成员。但父类中的私有成员只能在它的本类中使用,所以访问出错。

③保护的访问修饰符protected

被修饰为protected的成员,对于该类的子类及子类的子类都有访问权限,可以进行属性、方法的读写操作。但不能被该类的外部代码访问,该子类的外部代码也不具有方额外呢其属性和方法的权限。将上例中父类的访问权限改为protected修饰,就可以在子类中访问父类中的成员了,但在类的外部也是不能访问的,所以也可以完成对对象的封装的目的。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    class MyClass {
        protected $var1=100;
 
        protected function  printHello(){
            echo "hello<br>";    
        }
    }
 
    //声明一个Myclass类的子类师徒访问父类中的保护成员
    class MyClass2 extends MyClass{
        function useProperty(){
            echo "输出从父类继承过来的成员属性值".$this ->var1."<br>";
            $this ->printHello();
        }
    }
 
    $subObj = new MyClass2();
    $subObj -> useProperty();       //调用子类对象中的方法实现对父类私有成员的访问
 
    echo $subObj ->var1;         //试图访问类中受保护的成员,结果出错
?>

在上例中,将类MyClass中的成员使用protected修饰符设置为保护的,就可以在子类中直接访问。但在子类外部去访问protected修饰的成员则出错。

 

>> 本文固定链接: http://php.ncong.com/php_course/oop/fangwenlei.html

>> 转载请注明: 恩聪php 2014年07月24日 于 恩聪PHP学习教程 发表

php对象中类的继承性访问类型控制的更多相关文章

  1. python 之 前端开发( JavaScript变量、数据类型、内置对象、运算符、流程控制、函数)

    11.4 JavaScript 11.41 变量 1.声明变量的语法 // 1. 先声明后定义 var name; // 声明变量时无需指定类型,变量name可以接受任意类型 name= " ...

  2. Lua-面向对象中类的构造

    在Lua中,我们可以通过table+function来模拟实现类. 而要模拟出类,元表(metatable)和__index元方法是必不可少的. 为一个表设置元表的方法: table = {} met ...

  3. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

  4. JS运算符,流程控制,函数,内置对象,BOM与DOM

    运算符 1.算数运算符 运算符 描述 + 加 - 减 * 乘 / 除 % 取余(保留整数) ++ 递加 - - 递减 ** 幂 var x=10; var res1=x++; '先赋值后自增1' 10 ...

  5. java封装性、继承性及关键字

    方法的参数传递(重点.难点)1.形参:方法声明时,方法小括号内的参数   实参:调用方法时,实际传入的参数的值 2.规则:java中的参数传递机制:值传递机制 1)形参是基本数据类型的:将实参的值传递 ...

  6. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  7. Java——面向对象的特征二:继承性

    2.1面向对象的特征二:继承性 ①引入类继承最基本的作用是:代码重用. ②语法 [修饰符列表] class 子类名 extends 父类名{ 类体; } ③子类继承父类以后,父类中声明的属性.方法,子 ...

  8. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  9. 回顾Spirng ioc 控制反转

    Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的.结合网上对Spring Ioc的理解,回顾一下自 ...

随机推荐

  1. MySQL添加中文字符集问题 --- java.sql.SQLException: Incorrect string value

    今天在做开关记录的时候,数据库表中description字段用于记录当前版本的描述(需要存储中文),在测试程序的时候发现如果用户输入中文,那么后台会报错.错误信息如下: java.sql.SQLExc ...

  2. Collection Views and Building Custom Layouts-备

    UICollectionView的结构回顾 首先回顾一下Collection View的构成,我们能看到的有三个部分: Cells Supplementary Views 追加视图 (类似Header ...

  3. 【HDOJ】3518 Boring Counting

    后缀数组2倍增可解. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 10 ...

  4. 面试问题:关于java并发方面的

    主要是回答一下面试中可能会碰到的问题.慢慢的积累一下.一个星期以后,补全.

  5. 高级私人定制西服品牌:XUAN PRIVE 为定制而生_乐活_onlylady女人志

    高级私人定制西服品牌:XUAN PRIVE 为定制而生_乐活_onlylady女人志 高级私人定制西服品牌:XUAN PRIVE 为定制而生

  6. CentOS启动MySQL服务失败

    :: mysqld_safe Starting mysqld daemon with databases from /data/mysql :: [Warning] Can't create test ...

  7. hibernate 一对多双向关联 详解

    一.解析: 1.  一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...

  8. dialog中的button动态设置为disable[转]

    我们再写dialog的时候,会时常有这样一种需求,希望通过某些条件将dialog的button设置为disable的. 基本的命令就是将“确定”这个button设置为disable(false). 如 ...

  9. Android学习【Android内核编译流程和错误笔记】

    博客:http://blog.csdn.net/muyang_ren Ubuntu14.04 LTS(要求是64位长期支持版LTS) Jdk1.8 内核:android4.0 一:jdk 1.解压jd ...

  10. 各种快递查询--Api接口

    授权成功我的密钥 爱查快递API使用说明文档 API地址: 以前:http://api.ickd.cn/?com=[]&nu=[]&id=[]&type=[]&enco ...