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 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
php读取javascript设置的cookies的代码
Apr 12 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
python进程与线程小结实例分析
Nov 11 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 GeoIP的使用教程
2011/03/09 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
浅析Python面向对象编程
2020/07/10 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
竞选班长演讲稿
2013/12/30 职场文书
致800米运动员广播稿
2014/02/16 职场文书
社会调查研究计划书
2014/05/01 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
新文化运动的口号
2014/06/21 职场文书
公司委托书怎么写
2014/08/02 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
公司委托书格式范文
2014/10/09 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
2014年体育部工作总结
2014/11/13 职场文书
会计主管岗位职责
2015/04/02 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
关于Redis的主从复制及哨兵问题
2022/06/16 Redis