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 相关文章推荐
PHP中Session的概念
Oct 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
ThinkPHP之import方法实例详解
Jun 20 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
php批量修改表结构实例
May 24 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 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 include的妙用,实现路径加密
2008/07/29 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
深入理解PHP中的global
2014/08/19 PHP
JSQL  一个 web DB 的封装
2010/05/05 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
js评分组件使用详解
2017/06/06 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
python分割和拼接字符串
2013/11/01 Python
python之yield表达式学习
2014/09/02 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
python3.5仿微软计算器程序
2020/03/30 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
python实现随机加减法生成器
2020/02/24 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
海蓝之谜(LA MER)澳大利亚官方商城:全球高端奢华护肤品牌
2017/10/27 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
servlet面试题
2012/08/20 面试题
上课迟到检讨书
2014/01/19 职场文书
医药销售求职信范文
2014/02/01 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript