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 相关文章推荐
追求程序速度,而不是编程的速度
Apr 23 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
定义php常量的详解
Jun 09 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
yii上传文件或图片实例
Apr 01 PHP
php制作文本式留言板
Mar 18 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
PHP 常用时间函数资料整理
Oct 22 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
php利用gd库为图片添加水印
Nov 09 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
朴素贝叶斯算法的python实现方法
2014/11/18 Python
带你了解python装饰器
2017/06/15 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
Python实现时间序列可视化的方法
2019/08/06 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
MyBatis 动态SQL全面详解
2021/10/05 MySQL