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 相关文章推荐
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
PHP测试程序运行时间的类
Feb 05 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
php 生成短网址原理及代码
Jan 23 PHP
php通过session防url攻击方法
Dec 10 PHP
php文件下载处理方法分析
Apr 22 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
PHP实现动态web服务器方法
Jul 29 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 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获取文件后缀名的三个函数
2012/10/15 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
五步轻松实现zTree的使用
2017/11/01 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
python中list循环语句用法实例
2014/11/10 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
法学毕业生自荐信
2013/11/13 职场文书
小学安全教育材料
2014/02/17 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
环保倡议书
2014/04/14 职场文书
讲解员培训方案
2014/05/04 职场文书
产品发布会策划方案
2014/05/12 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
运动员代表致辞
2015/07/29 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android