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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
PHP新手上路(十三)
Oct 09 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP实现转盘抽奖算法分享
Apr 15 PHP
PHP日期和时间函数的使用示例详解
Aug 06 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源码之 ext/mysql扩展部分
2009/07/17 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP序列化操作方法分析
2016/09/28 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
Javascript实现单例模式
2016/01/24 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python numpy中cumsum的用法详解
2019/10/17 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Python-openCV开运算实例
2020/07/05 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
前台文员职责范本
2014/03/07 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
大学生毕业评语
2014/12/31 职场文书
迎新生欢迎词
2015/01/23 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
什么是SOLID
2022/03/24 Javascript