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 相关文章推荐
信用卡效验程序
Oct 09 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
php简单实现多语言切换的方法
May 09 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
Sep 26 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
基于php编程规范(详解)
Aug 17 PHP
详细解读php的命名空间(二)
Feb 21 PHP
php实现的顺序线性表示例
May 04 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的ASCII码转换类
2013/07/05 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
django框架auth模块用法实例详解
2019/12/10 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
如何通过python计算圆周率PI
2020/11/11 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
学生会离职感言
2014/02/11 职场文书
卫生巾广告词
2014/03/18 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
护士辞职信怎么写
2015/02/27 职场文书