PHP5中的this,self和parent关键字详解教程


Posted in PHP onMarch 19, 2007

首先我们来明白上面三个关键字: this,self,parent,从字面上比较好理解,是指这,自己,父亲,呵呵,比较好玩了,我们先建立几个概念,这三个关键字分别是用在什么地方呢?我们初步解释一下,this是指向当前对象的指针(我们姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达,呵呵,语文没学好。 -_-#
这么说还不能很了解,那我们就根据实际的例子结合来讲讲。
(1) this

<?php  
 class UserName  
 {   
     //定义属性      
     private $name;  
     //定义构造函数  
     function __construct( $name )  
     {  
          $this->name = $name; //这里已经使用了this指针  
     }  
     //析构函数  
     function __destruct(){}  
     //打印用户名成员函数  
     function printName()  
     {  
          print( $this->name ); //又使用了this指针  
     }  
 }  
 //实例化对象  
 $nameObject = new UserName( "heiyeluren" );  
 //执行打印  
 $nameObject->printName(); //输出: heiyeluren  
 //第二次实例化对象  
 $nameObject = new UserName( "PHP" );  
 //执行打印  
 $nameObject->printName(); //输出:PHP  
 ?>  

我们看,上面的类分别在行和行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(行),那么当时this就是指向$nameObject对象,那么执行行的打印的时候就把print( $this-><name )变成了print( $nameObject->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject->name ),于是就输出了"PHP"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。 
(2)self
首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。
<?php  
     class Counter  
     {  
         //定义属性,包括一个静态变量  
         private static $firstCount = ;  
         private $lastCount;  
         //构造函数  
         function __construct()  
         {  
              $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)  
         }  
         //打印最次数值  
         function printLastCount()  
         {  
              print( $this->lastCount );  
         }   
     }  
 //实例化对象  
 $countObject = new Counter();  
 $countObject->printLastCount(); //输出   
 ?>  

我们这里只要注意两个地方,第行和第行。我们在第二行定义了一个静态变量$firstCount,并且初始值为,那么在行的时候调用了这个值得,使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,可以使用self来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。
(3)parent
我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。
<?php  
 //基类  
 class Animal  
 {  
     //基类的属性  
     public $name; //名字  
     //基类的构造函数  
     public function __construct( $name )  
     {  
          $this->name = $name;  
     }  
 }  
 //派生类  
 class Person extends Animal //Person类继承了Animal类  
 {  
     public $personSex; //性别  
     public $personAge; //年龄  
     //继承类的构造函数  
     function __construct( $personSex, $personAge )  
     {  
          parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数  
          $this->personSex = $personSex;  
          $this->personAge = $personAge;  
     }  
     function printPerson()  
     {  
          print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge );  
      }  
 }  
 //实例化Person对象  
 $personObject = new Person( "male", "");  
 //执行打印  
 $personObject->printPerson(); //输出:heiyeluren is male,this year   
 ?>  

我们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,第行:parent::__construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用this来调用。
总结:
this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。
基本上我所了解就这么多,肯定有理解错误之处,请高手指出!
PHP 相关文章推荐
PHP执行速率优化技巧小结
Mar 15 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
php实现的漂亮分页方法
Apr 17 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP错误处理函数
Apr 03 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
php源码的安装方法和实例
Sep 26 PHP
一篇不错的PHP基础学习笔记
Mar 18 #PHP
PHP_MySQL教程-第一天
Mar 18 #PHP
PHP 中dirname(_file_)讲解
Mar 18 #PHP
PHP session常见问题集锦及解决办法总结
Mar 18 #PHP
用PHP生成html分页列表的代码
Mar 18 #PHP
用PHP生成静态HTML速度快类库
Mar 18 #PHP
PHP实现采集程序原理和简单示例代码
Mar 18 #PHP
You might like
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
thinkphp常见路径用法分析
2014/12/02 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
js控制框架刷新
2008/08/01 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python 性能优化技巧总结
2016/11/01 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
详解【python】str与json类型转换
2019/04/29 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Python和Bash结合在一起的方法
2020/11/13 Python
python 如何上传包到pypi
2020/12/24 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
init进程的作用
2012/04/12 面试题
一封普通求职者的求职信
2013/11/20 职场文书
个人作风建设心得体会
2014/10/22 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python