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 相关文章推荐
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
php生成EAN_13标准条形码实例
Nov 13 PHP
php字符串函数学习之strstr()
Mar 27 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
laravel 框架执行流程与原理简单分析
Feb 01 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
DOMXML函数笔记
2006/10/09 PHP
用Flash图形化数据(一)
2006/10/09 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
js中eval详解
2012/03/30 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
浅谈python中set使用
2016/06/30 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
python字典的遍历3种方法详解
2019/08/10 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
2014学雷锋活动心得体会
2014/03/10 职场文书
经典促销广告词大全
2014/03/19 职场文书
经典导游欢迎词
2015/01/26 职场文书
党员个人总结范文
2015/02/14 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js