PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有 了很多的面向对象的特性,但是有部分概念也比较难以理解,这里我主要谈的是 this,self,parent三个关键字之间的区别。从字面上比较好理解,分别是指这、自己、父亲。我们先建立几个概念,这三个关键字分别是用在什么 地方呢?我们初步解释一下,this是指向当前对象的指针(姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。我 们这里频繁使用指针来描述,是因为没有更好的语言来表达。

这么说还不能很了解,那我们就根据实际的例子结合来讲讲。

(1) this

1 <?php
2
3 class UserName
4 {
5     //定义属性
6     private $name;
7
8     //定义构造函数
9     function __construct( $name )
10     {
11          $this->name = $name; //这里已经使用了this指针
12     }
13
14     //析构函数
15     function __destruct(){}
16
17     //打印用户名成员函数
18     function printName()
19     {
20          print( $this-&gt;name ); //又使用了this指针
21     }
22 }
23
24 //实例化对象
25 $nameObject = new UserName( "heiyeluren" );
26
27 //执行打印
28 $nameObject-&gt;printName(); //输出: heiyeluren
29
30 //第二次实例化对象
31 $nameObject2 = new UserName( "PHP5" );
32
33 //执行打印
34 $nameObject2-&gt;printName(); //输出:PHP5
35 ?&gt;

我 们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象 的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this-&gt;<name )变成了print( $nameObject->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this-&gt;name )变成了print( $nameObject2-&gt;name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。

(2)self

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

1 <?php
2
3     class Counter
4     {
5         //定义属性,包括一个静态变量
6         private static $firstCount = 0;
7         private $lastCount;
8
9         //构造函数
10         function __construct()
11         {
12              $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
13         }
14
15         //打印最次数值
16         function printLastCount()
17         {
18              print( $this-&gt;lastCount );
19         }
20     }
21
22 //实例化对象
23 $countObject = new Counter();
24
25 $countObject-&gt;printLastCount(); //输出 1
26
27 ?&gt;

我 们这里只要注意两个地方,第6行和第12行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12行的时候调用了这个值, 使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$frestCount, 我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,可以使用 self来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。

(3)parent

我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。

1 <?php
2
3 //基类
4 class Animal
5 {
6     //基类的属性
7     public $name; //名字
8
9     //基类的构造函数
10     public function __construct( $name )
11     {
12          $this->name = $name;
13     }
14 }
15
16 //派生类
17 class Person extends Animal //Person类继承了Animal类
18 {
19     public $personSex; //性别
20     public $personAge; //年龄
21
22     //继承类的构造函数
23     function __construct( $personSex, $personAge )
24     {
25          parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数
26          $this-&gt;personSex = $personSex;
27          $this-&gt;personAge = $personAge;
28     }
29
30     function printPerson()
31     {
32          print( $this-&gt;name. " is " .$this-&gt;personSex. ",this year " .$this-&gt;personAge );
33      }
34 }
35
36 //实例化Person对象
37 $personObject = new Person( "male", "21");
38
39 //执行打印
40 $personObject-&gt;printPerson(); //输出:heiyeluren is male,this year 21
41
42 ?&gt;

我 们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,第25行: parent::__construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用 this来调用。

总结:

this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。

原文地址:http://hi.baidu.com/sneidar/blog/item/4c0015ecd4da9d38269791d3.html

转载于:https://blog.51cto.com/zeroone/712685

php中this,self,parent三个关键字之间的区别(转载)相关推荐

  1. php中this,self,parent三个关键字

    phpfunctionclass语言c this,self,parent三个关键字从字面上比较好理解,分别是指这.自己.父亲. this是指向当前对象的指针(姑且用C里面的指针来看吧) self是指向 ...

  2. PHP中的符号 -、= 和 :: 分别表示什么意思?以及this,self,parent三个关键字的理解!...

    一.->,=>和::的区别 ->前面的变量是一个对象: $user->friends_count 取对象的friends_count属性. $t->homeTimelin ...

  3. java中static、final 和 static final之间的区别

    java中static.final 和 static final之间的区别 static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类) 由于静态属性和方法是属于该类的所有对象的,所 ...

  4. java中双引号和单引号_Java中的单引号和双引号之间有区别吗?

    问题 Java中的单引号和双引号之间有区别吗? #1 热门回答(126 赞) 对于literalchar使用单引号,对于literalString使用双引号,如下所示: char c = 'a'; S ...

  5. 【整理】Python中的re.search和re.findall之间的区别和联系 + re.finall中带命名的组,不带命名的组,非捕获的组,没有分组四种类型之间的区别

    之前自己曾被搞晕过很多次. 后来使用这些函数次数多了之后,终于比较清楚的弄懂了两者之间的区别和关系了. 尤其是一些细节方面的注意事项了. 在看下面的总结和代码之前,请先确保你对如下基本概念已经有所了解 ...

  6. 09-Java中的抽象类、接口及两者之间的区别

    文章目录 一.抽象类 概念 抽象类的特点 举例:抽象类的简单定义 抽象类的成员特点 注意 抽象类的成员方法特性: 举例:抽象类如何实例化 思考 练习 二. 接口 概念 接口的特点 接口成员的特点 举例 ...

  7. java字面量和符号引用_java中字面量,常量和变量之间的区别(附:Integer缓存机制)...

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...

  8. C语言中指针*p、p以及p之间的区别以及*p和**p的区别

    *p.p以及&p之间的区别 假设我们定义一个指针p. 那么会经常使用到三个符号: 1,p: 2,*p; 3,&p; p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来 ...

  9. Pandas中map,applymap和apply方法之间的区别

    本文翻译自:Difference between map, applymap and apply methods in Pandas Can you tell me when to use these ...

最新文章

  1. 发票管理及打印系统的部分代码
  2. Ignite 的helloworld第二弹!(附源码!下载即用)
  3. 查询时注意 查询字段传值参数类型,尽量和数据库字段类型一致
  4. 防火墙简介(一)——iptables防火墙
  5. python打印小猪佩琪_极度舒适的 Python 入门教程,小猪佩奇也能学会~
  6. 【转】DICOM通信 - PDU数据包(1)
  7. 设计原本 --- 批判理性模型
  8. 一文浓缩 60 年,程序员不可不知的开源秘史!
  9. qj71c24n通讯实例_Q系列串行口通信模块用户参考手册QJ71C24N(基础篇).pdf
  10. Leetcode刷题笔记(部分非原创)(1-20题)
  11. 【开发工具集】功能强大的网络设置工具——IPOP
  12. Manjaro 常用软件安装
  13. Tools_Procexp找文件被哪个进程占用
  14. 测试计划、用例、测试报告、缺陷报告总结
  15. ubuntu里面控制器放大缩小屏幕
  16. 数据库关闭的四种方式
  17. 计算机二级真题论文排版,计算机二级word真题:供应链的管理论文排版
  18. 小型网络游戏实例(vc++)——网络五子棋
  19. 淘宝店铺用ps+dw装修的步骤
  20. 晓之以理,不如动之以情——新书《以大致胜》解读(下篇)

热门文章

  1. 产品经理第七章:互联网产品团队
  2. jdbc在项目中的应用
  3. 深入理解IOC模式及Unity框架
  4. C++中嵌入ie浏览器总结 .
  5. 已经感冒好长一段时间了 不过今天我的新blog开张
  6. 登陆模块防止恶意用户客户端攻击
  7. OpenCV 图像旋转
  8. ASP.NET中String.IndexOf 方法的使用
  9. 20189216 2018-2019-2 《密码与安全新技术专题》第七次作业
  10. 表单验证AngularJs