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的宝库目录--PEAR
Oct 09 PHP
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
计算2000年01月01日起到指定日的天数
Oct 09 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
Jun 21 PHP
解析php入库和出库
Jun 25 PHP
php几个预定义变量$_SERVER用法小结
Nov 07 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
php实现每日签到功能
2018/11/29 PHP
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
详解python的几种标准输出重定向方式
2016/08/15 Python
python 中split 和 strip的实例详解
2017/07/12 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Python pymongo模块用法示例
2018/03/31 Python
python 字符串和整数的转换方法
2018/06/25 Python
python中metaclass原理与用法详解
2019/06/25 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
产品工艺师的岗位职责
2013/11/15 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP