PHP中this,self,parent的区别

一、 PHP中this,self,parent的区别之一this篇

      面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。

PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性。这里我主要谈的是this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指这、自己、父亲。先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),self是指向当前类的指针parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达。关于指针的概念,大家可以去参考百科。

下面我们就根据实际的例子结合来讲讲。

<?phpclassname          //建立了一个名为name的类{private$name;         //定义属性,私有//定义构造函数,用于初始化赋值function __construct( $name ){$this->name =$name;         //这里已经使用了this指针语句①}//析构函数function __destruct(){}//打印用户名成员函数function printname(){print( $this->name);             //再次使用了this指针语句②,也可以使用echo输出}}$obj1 = new name("PBPHome");   //实例化对象 语句③//执行打印$obj1->printname(); //输出:PBPHomeecho"<br>";                                    //输出:回车//第二次实例化对象$obj2 = new name( "PHP" );//执行打印$obj2->printname();                         //输出:PHP?>

说明:上面的类分别在 语句①和语句②使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(语句③),那么当时this就是指向$obj1对象,那么执行语句②的打印时就把print( $this-><name ) 变成了 print($obj1t->name ),那么当然就输出了"PBPHome"。第二个实例的时候,print($this->name )变成了print( $obj2->name),于是就输出了"PHP"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。

 

二、PHP中this,self,parent的区别之二 self篇

此篇我们就self的用法进行讲解

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。假如我们使用类里面静态(一般用关键字static)的成员,我们也必须使用self来调用。还要注意使用self来调用静态变量必须使用:: (域运算符号),见实例。

 

<?phpclasscounter     //定义一个counter的类{//定义属性,包括一个静态变量$firstCount,并赋初值0 语句①  private static $firstCount = 0;private $lastCount;//构造函数function __construct(){$this->lastCount =++self::$firstCount;      //使用self来调用静态变量 语句②}//打印lastCount数值function printLastCount(){print( $this->lastCount );}}//实例化对象$obj = new Counter();$obj->printLastCount();                             //执行到这里的时候,程序输出1?>

  

这里要注意两个地方语句①和语句②。我们在语句①定义了一个静态变量$firstCount,那么在语句②的时候使用了self调用这个值,那么这时候我们调用的就是类自己定义的静态变量$frestCount。我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,因为self是指向类本身,与任何对象实例无关。然后前面使用的this调用的是实例化的对象$obj,大家不要混淆了。

关于self就说到这里,结合例子还是比较方便理解的。第二篇结束。

 

三、PHP中this,self,parent的区别之三parent篇

此篇我们就parent的用法进行讲解。

首先,我们明确,parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。实例如下:

<?php//建立基类Animalclass Animal{public $name; //基类的属性,名字$name//基类的构造函数,初始化赋值public function __construct( $name ){$this->name = $name;}}//定义派生类Person 继承自Animal类class Person extends Animal{public$personSex;       //对于派生类,新定义了属性$personSex性别、$personAge年龄public $personAge;//派生类的构造函数function __construct( $personSex, $personAge ){parent::__construct( "PBPHome");    //使用parent调用了父类的构造函数 语句①$this->personSex = $personSex;$this->personAge = $personAge;}//派生类的成员函数,用于打印,格式:名字 is name,age is 年龄function printPerson(){print( $this->name. " is ".$this->personSex. ",age is ".$this->personAge );}}//实例化Person对象$personObject = new Person( "male", "21");//执行打印$personObject->printPerson();//输出结果:PBPHome is male,age is 21?>

  

里面同样含有this的用法,大家自己分析。我们注意这么个细节:成员属性都是public(公有属性和方法,类内部和外部的代码均可访问)的,特别是父类的,这是为了供继承类通过this来访问。关键点在语句①:parent::__construct( "heiyeluren"),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,这样,继承类的对象就都给赋值了name为PBPHome。我们可以测试下,再实例化一个对象$personObject1,执行打印后name仍然是PBPHome。

总结:this是指向对象实例的一个指针,在实例化的时候来确定指向;self是对类本身的一个引用,一般用来指向类中的静态变量;parent是对父类的引用,一般使用parent来调用父类的构造函数。

转载于:https://www.cnblogs.com/chbyl/p/10634171.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ListView下拉刷新、上拉载入更多之封装改进

在Android中ListView下拉刷新、上拉载入更多示例一文中&#xff0c;Maxwin兄给出的控件比较强大&#xff0c;前面有详细介绍&#xff0c;但是有个不足就是&#xff0c;里面使用了一些资源文件&#xff0c;包括图片&#xff0c;String&#xff0c;layout&#xff0c;这样不利于封…

Refactoring Connection To Sql

您的程序不必登录设计一个库&#xff0c;注册设计一个库&#xff0c;一个站点设计一个库即可。您的连接数据库的字符串有写错&#xff0c;另外建议不要用中文来命名站点名或是网页名称。 Refactoring之后做法如下&#xff1a; 文件格式&#xff1a;.wmv&#xff1b;大小&#x…

linux 远程图形终端,图形终端远程操作Linux

一、想要在远程终端运用图形界面来操作和控制Linux效劳器&#xff0c;就在windows下像运用MSTSC(远程桌面)一样。linux经过XDMCP来提供这种支持&#xff0c;我们只需用一个终端仿真软件&#xff1a;xmanager&#xff0c;但是装完Xmanager后是不能直接远程衔接Linux效劳器的Xwin…

windows下nginx的安装及使用

1.下载nginx http://nginx.org/en/download.html 下载稳定版本&#xff0c;以nginx/Windows-1.12.2为例&#xff0c;直接下载 nginx-1.12.2.zip 下载后解压&#xff0c;解压后如下 2.启动nginx 有很多种方法启动nginx (1)直接双击nginx.exe&#xff0c;双击后一个黑色的…

win8.1出现 called runscript when not marked in progress

1.打开任务管理器-详细信息-结束图片中选择的进程 2.然后在任务管理器左上角“文件“>运行新任务&#xff1a; 输入C:\\Windows\explorer.exe&#xff0c;并勾选”以系统管理权限创建此任务“&#xff0c;点击确定&#xff1a; 3.这样就可以继续安装了。 转载于:https://www…

学游泳

今天上午又去了人大附中&#xff0c;门紧锁着&#xff0c;去正门一问才知道&#xff0c;要周末下午1点30才开门&#xff0c;平时是5点30。回家吧&#xff0c;外面居然下起了星星点点的小雪&#xff0c;北京的三月…… 学蛙泳 老旱四诀之蛙泳 分手压腕, 双锚拉纤, 高肘抱水, 翻…

Linux中内联函数,Windows 7上的内联函数的doParallel问题(适用于Linux)

我在Windows 7和Linux(SUSE Server 11(x86_64))上都使用R 3.0.1.以下示例代码在Windows上产生错误,但在Linux上不产生错误.列出的所有工具箱在两台机器中都是最新的.Windows错误是&#xff1a;Error in { : task 1 failed - "NULL value passed as symbol address"如…

Content-Disposition 响应头,设置文件在浏览器打开还是下载

Content-Disposition属性有两种类型&#xff1a;inline 和 attachment inline &#xff1a;将文件内容直接显示在页面 attachment&#xff1a;弹出对话框让用户下载 code: context.Response.ContentType "text/plain"; string fileName context.Request[&qu…

两个栈实现双端队列

一个笔试题&#xff0c;当时竟然没想出来&#xff0c;现在实现下 1 /*2 用两个栈实现双端队列3 栈s1&#xff0c;s2。4 pushback()和popback(),必须在s2为空的情况&#xff0c;把s2的都放s1中5 pushfront()和popfront(),必须是在s1为空&#xff0c;把s1的都给放到s2中6 */7 #in…

Java web 打印方案---数飞OA打印方案总结

Web系统中&#xff0c;打印功能一直是个老大难问题&#xff0c;因此产生了很多第三方的控件&#xff0c;多数要收费&#xff0c;而且跟自己的系统结合有一定的麻烦。数飞OA系统采用J2EE技术&#xff0c;jsp打印问题同样存在于OA中。 在数飞OA中&#xff0c;打印方式有三种&…

Linux ftp ldap认证,vsftpd+ldap认证

一、环境系统 CentOS 6.4x64最小化安装IP 192.168.3.19二、安装ldap[roottest ~]# yum install openldap openldap-* -y[roottest ~]# yum install nscd nss-pam-ldapd nss-* pcre pcre-* -y配置ldap[roottest ~]# cd /etc/openldap/[roottest openldap]# cp /usr/sha…

es6-变量的解构赋值

从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构 let [foo, [[bar], baz]] [1, [[2], 3]]; foo // 1 bar // 2 baz // 3let [ , , third] ["foo", "bar", "baz"]; third // "baz"let [x, , y] [1, 2, 3];…

浏览器的渲染原理

看到这个标题大家一定会想到这篇神文《How Browsers Work》&#xff0c;这篇文章把浏览器的很多细节讲得很细&#xff0c;而且也被翻译成了中文。为什么我还想写一篇呢&#xff1f;因为两个原因&#xff0c; 1&#xff09;这篇文章太长了&#xff0c;阅读成本太大&#xff0c;不…

AO 直接调用GeoProcessing 工具

Geoprocessing是ArcGIS的一个基础组成部分。无论你是一个新手抑或老资格的专家&#xff0c;geoprocessing都是你使用ArcGIS完成每天工作的一部分。它提供了数据分析、数据管理和数据转换等对于所用GIS用户都必须的工具&#xff0c;当然也包括ArcObjects开发者。GIS程序通常需要…

Linux环境变量PSI指什么,PSI 文件扩展名: 它是什么以及如何打开它?

了解 PSI 问题常见的 PSI 打开问题缺少 PrimalScript双击你的 PSI 文件会提示消息 “%%os%% 无法打开 PSI 文件”。 通常&#xff0c;%%os%% 中会出现这种情况&#xff0c;因为 PrimalScript 未安装在你的电脑上。 由于您的操作系统不知道如何处理此文件&#xff0c;因此无法通…

linux 修改文件时间

1、ls -l *.sh 2、touch -d "10/13/2013" *.sh 【我想把所以的.sh文件修改到三个月前&#xff08;2013年10月13&#xff09;的时间。】3、ls -l *.sh 参考文章 http://blog.itpub.net/29283412/viewspace-1070106/ 另外也可以单独修改时间或者月份&#xff0c;如下以…

datetime模块日期转换和列表sorted排序

import datetime dt 2019010103 # 日期 2019年1月1日3时 dts (datetime.datetime.strptime(dt, %Y%m%d%H) datetime.timedelta(days-1)).strftime(%Y%m%d%H) # 将dt向前或向后调整&#xff08;day表示天&#xff0c;hours表示表示小时&#xff0c;负数往前正数往后&#xf…

差距

现在看明白了自己的距离&#xff0c;该从何处下手&#xff1f; 时间是怎么争取出来的&#xff1f;转载于:https://www.cnblogs.com/rosion/archive/2009/04/11/1433450.html

linux 命令tf,Linux文件管理命令

本篇涉及命令&#xff1a;cat,tac,more,less,head,tail,file,stat,touch,which,whatis,whereis,ls,mkdir,rmdir,tree,cp,mv,rm文本文件查看类命令cat 查看文件内容(concatenate)cat命令用于查看一个或多个文本文件内容&#xff0c;可以将两个或两个以上的文件连接起来并显示&am…

Python实现——二元线性回归(最小二乘法)

2019/3/30二元线性回归——矩阵公式法_又名&#xff1a;对于python科学库的糟心尝试_ 二元线性回归严格意义上其实不过是换汤不换药&#xff0c;我对公式进行推导&#xff0c;其实也就是跟以前一样的求偏导并使之为零&#xff0c;并且最终公式的严格推导我大概也只能说是将将理…