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中使用gettext解决国际化问题的例子(i18n)
Jun 13 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
详细对比php中类继承和接口继承
Oct 11 PHP
Yii2框架自定义类统一处理url操作示例
May 25 PHP
laravel 如何实现引入自己的函数或类库
Oct 15 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 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
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
详解php协程知识点
2018/09/21 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
jQuery 操作XML入门
2008/12/25 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
python解析xml文件实例分享
2013/12/04 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
Python正则表达式知识汇总
2017/09/22 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
三个Unix的命令面试题
2015/04/12 面试题
银行实习生自我鉴定范文
2013/09/19 职场文书
学生个人求职自荐信格式
2013/09/23 职场文书
优秀的茶餐厅创业计划书
2014/01/03 职场文书
高中军训感言200字
2014/02/23 职场文书
闭幕式主持词
2014/04/02 职场文书
远程培训的心得体会
2014/09/01 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
Python必备技巧之函数的使用详解
2022/04/04 Python