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&amp;&amp;mysql)一
Oct 09 PHP
php完全过滤HTML,JS,CSS等标签
Jan 16 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
一步一步学习PHP(8) php 数组
Mar 05 PHP
PHP提取字符串中的图片地址[正则表达式]
Nov 12 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
php浏览历史记录的方法
Mar 10 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
Yii框架常见缓存应用实例小结
Sep 09 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
linux下为php添加curl扩展的方法
2011/07/29 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
react实现同页面三级跳转路由布局
2019/09/26 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
python pickle 和 shelve模块的用法
2013/09/16 Python
python正则表达式re模块详细介绍
2014/05/29 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python烟花效果的代码实例
2020/02/25 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
介绍一下gcc特性
2015/10/31 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
2015年端午节活动方案
2015/05/05 职场文书
开业庆典致辞
2015/08/01 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL