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 相关文章推荐
第九节 绑定 [9]
Oct 09 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
PHP与MySQL开发中页面乱码的产生与解决
Mar 27 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
Oct 29 PHP
6个超实用的PHP代码片段
Aug 10 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
PHP对象链式操作实现原理分析
Oct 09 PHP
php+js实现百度地图多点标注的方法
Nov 30 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
PHP实现常用排序算法的方法
Feb 05 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
PHP之header函数详解
Mar 02 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编码规范之注释和文件结构说明
2010/07/09 PHP
joomla组件开发入门教程
2016/05/04 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
javascript表单验证和Window详解
2014/12/11 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
基于jquery实现图片放大功能
2016/05/07 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
春节联欢晚会主持词
2014/03/24 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS