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数组
Oct 09 PHP
php session 错误
May 21 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
Aug 07 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 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/09/13 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
node.js express中app.param的用法详解
2017/07/16 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
小程序实现密码输入框
2020/11/16 Javascript
Python实例之wxpython中Frame使用方法
2014/06/09 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python过滤列表用法实例分析
2016/04/29 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python内存映射文件读写方式
2020/04/24 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
婚纱摄影师求职信
2014/03/07 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
员工辞职信范文大全
2015/05/12 职场文书
中学生运动会广播稿
2015/08/19 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python