理解self,this,parent

理解self,this,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->name ); //又使用了this指针
21     }
22 }
23
24 //实例化对象
25 $nameObject = new UserName( "heiyeluren" );
26
27 //执行打印
28 $nameObject->printName(); //输出: heiyeluren
29
30 //第二次实例化对象
31 $nameObject2 = new UserName( "PHP5" );
32
33 //执行打印
34 $nameObject2->printName(); //输出:PHP5
35 ?>

我 们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?
其实this是在实例化的时候来确定指向谁,比如第一次实例化对象 的时候(25行),
那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this->name )变成了print( $nameObject->name ),那么当然就输出了”heiyeluren”。
第二个实例的时候,print( $this- >name )变成了print( $nameObject2->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->lastCount );
19         } 
20     }
21
22 //实例化对象
23 $countObject = new Counter();
24
25 $countObject->printLastCount(); //输出 1
26
27 ?>

我 们这里只要注意两个地方,第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->personSex = $personSex;
27          $this->personAge = $personAge;
28     }
29
30     function printPerson()
31     {
32          print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge );
33      }
34 }
35
36 //实例化Person对象
37 $personObject = new Person( "male", "21");
38
39 //执行打印
40 $personObject->printPerson(); //输出:heiyeluren is male,this year 21
41
42 ?>

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

总结:

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

转载于:https://www.cnblogs.com/libin123/p/10367435.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101126.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SpringBoot(SpringMVC)文件上传下载

    SpringBoot(SpringMVC)文件上传下载话说,springboot不是一个全新的框架,它只是将其它框架整合在一起,提供一个”开箱即用”的环境。此文,利用的正是SpringMVC的功能。创建springboot项目:https://blog.csdn.net/weixin_41381863/article/details/106504682文件上传在开发中,文件上传常用的有两种方式。一、利用base64上传文件思路:客户端将要上传的文件转为base64的二进制数据,服务端利用字符串的形式接收参数,然后将base64转为相应的文件

  • 创建线程池的七种方式为_全局线程池如何创建

    创建线程池的七种方式为_全局线程池如何创建创建线程池的7种方式

  • java 命令 native2ascii_java native2ascii.exe命令

    java 命令 native2ascii_java native2ascii.exe命令native2ascii.exe是Java的一个文件转码工具native2ascii.exe的语法格式:native2ascii[-reverse][-encoding编码][输入文件[输出文件]]说明:-reverse:将Unicode编码转为本地编码。-reverse-encoding编码:将指定编码转为本地编码。-encoding编码:转换为指定编码。空:转换为Unic…

  • sql中的convert转换数字_Convert

    sql中的convert转换数字_Convert   一般写程序是用的都是Convert.ToInt32,为什么呢?1.Convert.ToInt是数据类型转换成int类型2.   有三种方法toint16,toint32,toint64   int16-数值范围:-32768到32767   int32-数值范围:-2,147,483,648到2,147,483,647   int64…

  • 查看sqlite_sqlite数据库手机版

    查看sqlite_sqlite数据库手机版这是什么用于SQLite的数据库浏览器(DB4S)是一种高质量,可视化的开源工具,用于创建,设计和编辑与SQLite兼容的数据库文件。DB4S适用于想要创建,搜索和编辑数据库的用户和开发人员。DB4S使用熟悉的类似电子表格的界面,并且不必学习复杂的SQL命令。控件和向导可供用户使用:创建并压缩数据库文件 创建,定义,修改和删除表 创建,定义和删除索引 浏览,编辑,添加和删除记录 搜索记录 导入和导出记录为文本 从CSV文件导入和导出表格 从/到SQL转储文件导入和导出数据库

  • vmm安装hassos_安装freenas无法启动

    vmm安装hassos_安装freenas无法启动提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档使用群辉VMM安装freenas前言用vm玩一段时间黑群NAS,就像尝试一下用VMM,觉得想折腾一下freenas。感觉有啥区别。下面是我安装的教程以及遇到的一些问题。保姆级教程。一、需要准备文件1,freenasFreeNAS-11.2-U7.iso2、打开群辉VMM3.添加镜像文件。其他系统的也可以添加进来,选择ISO下载的镜像文件。![在这里插入图片描述](https://img-blog.csdnimg.cn/28.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号