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 相关文章推荐
Windows PHP5和Apache的安装与配置
Jun 08 PHP
PHP开发中的错误收集,不定期更新。
Feb 03 PHP
PHPEXCEL 使用小记
Jan 06 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
zf框架db类的分页示例分享
Mar 14 PHP
PHP中通过trigger_error触发PHP错误示例
Jun 23 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
用PHP的socket实现客户端到服务端的通信实例详解
Feb 04 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 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
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
PHP与MySQL交互使用详解
2006/10/09 PHP
PHP学习之整理字符串
2011/04/17 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
python mysqldb连接数据库
2009/03/16 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
大学生入党自我鉴定
2013/10/31 职场文书
有个性的自我评价范文
2013/11/15 职场文书
青年文明号事迹材料
2014/01/18 职场文书
节能环保口号
2014/06/12 职场文书
团日活动总结怎么写
2014/06/25 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
Python中Selenium对Cookie的操作方法
2021/07/09 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL