类型的访问控制通过使用修饰符允许开发人员对类中成员的访问进行限制。这是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. 判断iOS设备是否越狱

    - (BOOL)isJailbroken { BOOL jailbroken = NO; NSString *cydiaPath = @"/Applications/Cydia.app&qu ...

  2. java入门时的一些基本概念的理解(j2ee,j2se,j2me,jdk,sdk,jre,jvm,跨平台)

    首先声明,这篇文章是从网上粘贴过来的.原文地址是:http://www.cnblogs.com/wangaohui/archive/2012/11/28/2791999.html.感觉写的很好,所以粘 ...

  3. 转:fopen()函数

    1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都可以通过文件管理的方法来完成.而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 详细介绍Turb ...

  4. ural 1348 Goat in the Garden 2

    http://acm.timus.ru/problem.aspx?space=1&num=1348 #include <cstdio> #include <cstring&g ...

  5. ural 1874 Football Goal

    #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> u ...

  6. atof

    So given a string like "2.23" your function should return double 2.23. This might seem eas ...

  7. VCRedist.exe静默安装方法(转)

    INNO setup 制作安装包  的时候,发布VC++运行时 [Run]Filename: {app}vcredist_x86.exe; Parameters: /q; WorkingDir: {t ...

  8. windows 触发桌面图标布局保存

    问题: 项目原有的一套结构由于引进了一个磁盘套件,类似于关闭系统的explorer.exe进程,进入到他所维护的explorer.exe中.于是出现了当退出磁盘的时候没有保存好桌面布局信息导致下次进入 ...

  9. JAVA并发七(多线程环境中安全使用集合API)

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  10. 【初学者常见问题】一脚踏入protected埋下的陷阱

    受保护的(protected)——声明该成员的类的子类可以访问这个类的成员(但有一定的限制),并且,声明该成员的包内部的任何类也可以访问这个成员 protected修饰符参考:http://www.3 ...