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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
PHP的类 功能齐全的发送邮件类
Oct 09 PHP
wordpress之wp-settings.php
Aug 17 PHP
php中的观察者模式
Mar 24 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
php去除重复字的实现代码
Sep 16 PHP
php使用google地图应用实例
Dec 31 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
Linux系统下PHP-FPM的安装和配置教程
Aug 17 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
pandas分区间,算频率的实例
2019/07/04 Python
浅谈Python 递归算法指归
2019/08/22 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
深入了解Python 变量作用域
2020/07/24 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
市场营销专业应届生自荐信
2014/06/19 职场文书
2014年仓库工作总结
2014/11/20 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
导师鉴定意见
2015/06/05 职场文书
人力资源部工作计划
2019/05/14 职场文书