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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
php 获得汉字拼音首字母的函数
Aug 01 PHP
PHP 危险函数全解析
Sep 09 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
php中++i 与 i++ 的区别
Aug 08 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
php使用cookie实现记住用户名和密码实现代码
Apr 27 PHP
php实现复制移动文件的方法
Jul 29 PHP
汇总PHPmailer群发Gmail的常见问题
Feb 24 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 PHP
PHP中SESSION过期设置
Mar 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
详解no input file specified 三种解决方法
2019/11/29 PHP
JavaScript中实现块作用域的方法
2010/04/01 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
经济学人订阅:The Economist
2018/07/19 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
工程部经理岗位职责
2013/12/08 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
争先创优公开承诺书
2014/08/30 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
天下第一关导游词
2015/02/06 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
第一书记观后感
2015/06/08 职场文书
初中班主任工作随笔
2015/08/15 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技