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 相关文章推荐
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
PHP数据类型的总结分析
Jun 13 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 PHP
两个php日期控制类实例
Dec 09 PHP
PHP SplObjectStorage使用实例
May 12 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
php session的应用详细介绍
Mar 22 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 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生成EAN_13标准条形码实例
2013/11/13 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
js调用flash的效果代码
2008/04/26 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
python修改注册表终止360进程实例
2014/10/13 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
python生成带有表格的图片实例
2019/02/03 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python烟花效果的代码实例
2020/02/25 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
自动化职业生涯规划书范文
2014/01/03 职场文书
安全生产工作汇报
2014/10/28 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
python缺失值填充方法示例代码
2022/12/24 Python