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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
PHP提取中文首字母
Apr 09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
Jul 16 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
XAMPP安装与使用方法详细解析
Nov 27 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
php生成带logo二维码方法小结
Apr 08 PHP
PHP中rename()函数的妙用讲解
Feb 28 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面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
深入理解vue中的$set
2017/06/01 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
python封装对象实现时间效果
2020/04/23 Python
Python制作数据导入导出工具
2015/07/31 Python
python select.select模块通信全过程解析
2017/09/20 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
Python File(文件) 方法整理
2019/02/18 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
学生实习推荐信范文
2013/11/26 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
承诺书格式范文
2014/06/03 职场文书
小学重阳节活动总结
2015/03/24 职场文书
民事调解协议书
2016/03/21 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python