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
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
模板引擎Smarty深入浅出介绍
Dec 06 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
PHP框架性能测试报告
May 08 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP 中常量的知识整理
Apr 14 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 mail()函数使用及配置方法
2014/01/14 PHP
php学习笔记之面向对象
2014/11/08 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
node.js中的console用法总结
2014/12/15 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
python命令 -u参数用法解析
2019/10/24 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
Tostadora意大利:定制T恤
2019/04/08 全球购物
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
产品工艺师的岗位职责
2013/11/15 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
挂职个人工作总结
2015/03/05 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
企业愿景口号
2015/12/25 职场文书