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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
精美漂亮的php分页类代码
Apr 02 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP实现的分解质因数操作示例
Aug 01 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
layui 给数据表格加序号的方法
2018/08/20 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
python的mysqldb安装步骤详解
2017/08/14 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
Python控制Firefox方法总结
2019/06/03 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
python有几个版本
2020/06/17 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
学生社团文化节开幕式主持词
2014/03/28 职场文书
青春励志演讲稿
2014/04/29 职场文书
法人委托书范本格式
2014/09/15 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
道歉情书大全
2015/05/12 职场文书
装修公司管理制度
2015/08/05 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
解决Pytorch中关于model.eval的问题
2021/05/22 Python
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis