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 magic_quotes_gpc的一点认识与分析
Aug 18 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP中数据库单例模式的实现代码分享
Aug 21 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
PHP实现的简单异常处理类示例
May 04 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 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中让人头疼的浮点数运算分析
2016/10/10 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
局火灾防控工作方案
2014/05/25 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
公司老总年会致辞
2015/07/30 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python