php面向对象全攻略 (九)访问类型


Posted in PHP onSeptember 30, 2009

13.访问类型
类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5 的新特性,但却
是OOP 语言的一个好的特性。而且大多数OOP 语言都已支持此特性。PHP5 支持如下3 种访
问修饰符
public (公有的、默认的),private (私有的)和protected (受保护的)三种。
public 公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)
这个类成员(包括成员属性和成员方法),在PHP5 之前的所有版本中,PHP 中类的成员都是
public 的,而且在PHP5 中如果类的成员没有指定成员访问修饰符,将被视为public。
例:public $name;
public function say(){};
private 私有修改符,被定义为private 的成员,对于同一个类里的所有成员是可见的,即
是没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不
能访问private 修饰的成员。
例:private $var1 = ‘A'; //属性
private function getValue(){} //函数
protected 保护成员修饰符,被修饰为protected 的成员不能被该类的外部代码访问。但是
对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的
子类都不具有访问其属性和方法的权限。
例:protected $name;
protected function say(){};
private protected public
同一个类中 √ √ √
类的子类中 √ √
所有的外部成员 √
代码片段

<?php 
/** 
* Define MyClass 
*/ 
class MyClass{ 
public $public = 'Public'; 
protected $protected = 'Protected'; 
private $private = 'Private'; 
function printHello(){ 
echo $this->public; 
echo $this->protected; 
echo $this->private; 
} 
} 
$obj = new MyClass(); 
echo $obj->public; //Works 
echo $obj->protected; // Fatal Error 
echo $obj->private; // Fatal Error 
$obj->printHello(); // Shows Public, Protected and Private 
/** 
* Define MyClass2 
*/ 
class MyClass2 extends MyClass{ 
//We can redeclare the public and protected method, but not private 
protected $protected = 'Protected2'; 
function printHello(){ 
echo $this->public; 
echo $this->protected; 
echo $this->private; 
} 
} 
$obj2 = new MyClass2(); 
echo $obj->public; //Works 
echo $obj2->private; // Undefined 
echo $obj2->protected; // Fatal Error 
$obj2->printHello(); // Shows Public, Protected2, not Private 
?>

代码片段
<?php 
/** 
* Define MyClass 
*/ 
class MyClass{ 
// Contructors must be public 
public function __construct() { } 
// Declare a public method 
public function MyPublic() { } 
// Declare a protected method 
protected function MyProtected() { } 
// Declare a private method 
private function MyPrivate() { } 
// This is public 
function Foo() { 
$this->MyPublic(); 
$this->MyProtected(); 
$this->MyPrivate(); 
} 
} 
$myclass = new MyClass; 
$myclass->MyPublic(); //Works 
$myclass->MyProtected(); // Fatal Error 
$myclass->MyPrivate(); // Fatal Error 
$myclass->Foo(); // Public, Protected and Private work 
/** 
* Define MyClass2 
*/ 
class MyClass2 extends MyClass{ 
// This is public 
function Foo2(){ 
$this->MyPublic(); 
$this->MyProtected(); 
$this->MyPrivate(); // Fatal Error 
} 
} 
$myclass2 = new MyClass2; 
$myclass2->MyPublic(); // Works 
$myclass2->Foo2(); // Public and Protected work, not Private 
?>

另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类
被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
例如,如果父类方法的访问权限是protected 那么子类中要覆盖的权限就要是protected
和public,如果父类的方法是public 那么子类中要覆盖的方法只能也是public,总之子类中的
方法总是要高于或等于父类被覆盖方法的访问权限。
PHP 相关文章推荐
CodeIgniter php mvc框架 中国网站
May 26 PHP
PHP提取字符串中的图片地址[正则表达式]
Nov 12 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
Sep 10 PHP
PHP递归复制、移动目录的自定义函数分享
Nov 18 PHP
浅谈json_encode用法
Mar 05 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
如何用PHP做到页面注册审核
Mar 02 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 #PHP
php面向对象全攻略 (七) 继承性
Sep 30 #PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 #PHP
php面向对象全攻略 (五) 封装性
Sep 30 #PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 #PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 #PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 #PHP
You might like
PHP数学运算与数据处理实例分析
2016/04/01 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
Python的设计模式编程入门指南
2015/04/02 Python
python Django框架实现自定义表单提交
2016/03/25 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
数据库基础的一些面试题
2012/02/25 面试题
期末总结的个人自我评价
2013/11/02 职场文书
五一劳动节活动记录
2014/03/23 职场文书
宣传口号大全
2014/06/16 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
MySQL创建定时任务
2022/01/22 MySQL