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+MySQL5.0中文乱码解决方法
Nov 20 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
destoon复制新模块的方法
Jun 21 PHP
php中 ob_start等函数截取标准输出的方法
Jun 22 PHP
php组合排序简单实现方法
Oct 15 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 PHP
PHP获取学生成绩的方法
Nov 17 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
农民C键的运用技巧
2020/03/04 星际争霸
isset和empty的区别
2007/01/15 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Python字符串的修改方法实例
2019/12/19 Python
什么是python类属性
2020/06/10 Python
Python turtle库的画笔控制说明
2020/06/28 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
导游词之舟山普陀山
2019/11/06 职场文书