PHP 作用域解析运算符(::)


Posted in PHP onJuly 27, 2010

Scope Resolution Operator (::)
今天 看joomla源码的时候,才意识到。原来这个操作符还可以访问类的非静态方法啊。真的让我吃惊不好。一直以为作用域解析运算符只能访问类的static方法和static成员变量。
如果各位不相信,下面有个简单的小测试代码可以证明这个。

class A{ 
private $_name = 'A'; 
function __construct(){ 
echo 'A construct <br />'; 
} 
function test(){ 
echo 'A test() <br />'; 
} 
} 
class B extends A{ 
private $_name = 'B'; 
function __construct(){ 
parent::__construct(); 
echo 'B construct <br />'; 
} 
function test(){ 
echo 'B test()'; 
} 
} 
A::test(); 
echo '######### <br />'; 
B::test();

这段代码输入的结果为:
A test() 
######### 
B test()

虽然A类中的test()和B类中的test都不是 static方法,但是一样可以用 “类名::方法名称(参数列表)” 的样式进行正确调用。他的效果和 new 一个类的实例,然后用这个实例调用
test方法是一个样的。
但是,如果我需要在test方法中打印name属性,直接用::来调用 会是怎么个情况那.我们首先来修改下 上面的代码。
class A{ 
private $_name = 'A'; 
function __construct(){ 
echo 'A construct <br />'; 
} 
function test(){ 
echo 'A test() <br />', $this->$_name,'<br />'; 
} 
} 
class B extends A{ 
private $_name = 'B'; 
function __construct(){ 
parent::__construct(); 
echo 'B construct <br />'; 
} 
function test(){ 
echo 'B test()', $this->_name,'<br />'; 
} 
} 
A::test(); 
echo '######### <br />'; 
B::test();

上面的代码运行的结果 如下:
Fatal error: Using $this when not in object context in D:\www\test\scoperefe.php on line 9 
[html] 
那有的朋友就说了。你压根就没有实例化类A,当然不能直接用$this->_name的方式来访问成员变量$_name了,那么,是不是修改成self::$_name就行了哪? 
说干就干,下面把上面的代码修改下 
[code] 
class A{ 
private $_name = 'A'; 
function __construct(){ 
echo 'A construct <br />'; 
} 
function test(){ 
echo 'A test() <br />', self::$_name,'<br />'; 
} 
} 
class B extends A{ 
private $_name = 'B'; 
function __construct(){ 
parent::__construct(); 
echo 'B construct <br />'; 
} 
function test(){ 
echo 'B test()', $this->_name,'<br />'; 
} 
} 
A::test(); 
echo '######### <br />'; 
B::test();

再运行上面的代码,结果如下:
A test() Fatal error: Access to undeclared static property: A::$_name in D:\www\test\scoperefe.php on line 9

哦,原来不能用self 关键字访问当前类的非static方法。
现在,如果想正确的调用这个方法,有2个做法:
1、首先实例化类,然后用对象调用就可以直接使用$this->_name进行调用了;
2、将成员变量$_name设置为static;

上面的问题,相信大家都能够正确的处理。

其实我真正想说的是:
如果一个方法可以不进行实例化就调用,那么我们最好把这个方法使用static关键字修饰下。在实现方法的时候,只调用该类的static成员变量。这样就不会出现上面遇到问题了。
如果一个方法没有设置为static的方法。那么,最安全的做法还是用实例对象进行调用更为安全,因为,说不定什么时候就需要修改该方法的实现,在修改的时候,说不定就要调用该类中的
非static成员变量(因为,很大程度上在修改方法的实现的时候,已经忘记还有用类名直接调用这么一说)。

个人愚见。

PHP 相关文章推荐
怎样在PHP中通过ADO调用Asscess数据库和COM程序
Oct 09 PHP
PHP 操作文件的一些FAQ总结
Feb 12 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
CI框架简单分页类用法示例
Jun 06 PHP
PHP中的integer类型使用分析
Jul 27 #PHP
PHP中的float类型使用说明
Jul 27 #PHP
PHP中的string类型使用说明
Jul 27 #PHP
PHP中的array数组类型分析说明
Jul 27 #PHP
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 #PHP
PHP array 的加法操作代码
Jul 24 #PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 #PHP
You might like
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php筛选不存在的图片资源
2015/04/28 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
js 深拷贝函数
2008/12/04 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python集合常见运算案例解析
2019/10/17 Python
Django如何使用redis作为缓存
2020/05/21 Python
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
八项规定整改方案
2014/02/21 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
企业文化标语口号
2014/06/09 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
学前教育专业求职信
2014/09/02 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
MySQL 计算连续登录天数
2022/05/11 MySQL