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 相关文章推荐
phpwind中的数据库操作类
Jan 02 PHP
台湾中原大学php教程孙仲岳主讲
Jan 07 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
在html文件中也可以执行php语句的方法
Apr 09 PHP
php计算年龄精准到年月日
Nov 17 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
PHP abstract 抽象类定义与用法示例
May 29 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
PHP的ASP防火墙
2006/10/09 PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
Python使用Supervisor来管理进程的方法
2015/05/28 Python
Python实现telnet服务器的方法
2015/07/10 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
django Admin文档生成器使用详解
2019/07/22 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
财务人员求职自荐书范文
2014/02/10 职场文书
公司董事长助理工作职责
2014/07/12 职场文书
2014年度考核工作总结
2014/12/24 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python