搜尋
首頁後端開發php教程this,self,parent 差别 以及 PHP双冒号:的用法

this,self,parent 区别 以及 PHP双冒号::的用法

PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说的不好,请高手见谅. (阅读本文,需要了解PHP5的面向对象的知识)
首 先我们来理解三个关键字: this,self,parent,从字面上比较好理解,是指这,自己,父亲,呵呵,比较好玩了,我们先建立几个概念,这三个关键字分别是用在什么地方 呢?我们初步解释一下,this是指向当前对象的指针(我们姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。

这么说还不能很了解,那我们就根据实际的例子结合来讲讲。
(1) this
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
//第二次实例化对象
$nameObject2 = new UserName( "PHP5" );
//执行打印
$nameObject2->printName(); //输出:PHP5
?>
我 们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象 的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。
?
?
(2)self
首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。
???? class Counter
???? {
???????? //定义属性,包括一个静态变量
???????? private static $firstCount = 0;
???????? private $lastCount;
??????? //构造函数
???????? function __construct()
???????? {
????????????? $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
???????? }
???????? //打印最次数值
???????? function printLastCount()
???????? {
?????????????? print( $this->lastCount );
???????? }
??? }
//实例化对象
$countObject = new Counter();
$countObject->printLastCount(); //输出 1
?>

我 们这里只要注意两个地方,第6行和第12行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12行的时候调用了这个值 得,使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$ frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,可以使用 self来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。
(3)parent
我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。
//基类
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", "21");
//执行打印
$personObject->printPerson(); //输出:heiyeluren is male,this year 21
?>

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


总的来说 THIS 就是当前对象实例, static静态变量,const常量,构造函数,与对象的实例无关,它只是跟类有关,所以用::


Program List:用变量在类定义外部访问
??? ??? class Fruit {
??????? const CONST_VALUE = 'Fruit Color';
??? }
????
??? $classname = 'Fruit';
??? echo $classname::CONST_VALUE; // As of PHP 5.3.0
????
??? echo Fruit::CONST_VALUE;
??? ?>
Program List:在类定义外部使用::
??? ??? class Fruit {
??????? const CONST_VALUE = 'Fruit Color';
??? }
????
??? class Apple extends Fruit
??? {
??????? public static $color = 'Red';
????
??????? public static function doubleColon() {
??????????? echo parent::CONST_VALUE . "\n";
??????????? echo self::$color . "\n";
??????? }
??? }
????
??? Apple::doubleColon();
??? ?>

程序运行结果:
1??? Fruit Color Red
Program List:调用parent方法
??? ??? class Fruit
??? {
??????? protected function showColor() {
??????????? echo "Fruit::showColor()\n";
?????? }
??? }
????
??? class Apple extends Fruit
??? {
??????? // Override parent's definition
??????? public function showColor()
??????? {
?????????? // But still call the parent function
??????????? parent::showColor();
??????????? echo "Apple::showColor()\n";
??????? }
??? }
????
??? $apple = new Apple();
?? $apple->showColor();? 不是静态 的
??? ?>

程序运行结果:
1??? Fruit::showColor()
2??? Apple::showColor()
Program List:使用作用域限定符
??? ??????? class Apple
??????? {
??????????? public function showColor()
??????????? {
??????????????? return $this->color;
??????????? }
??????? }
????
??????? class Banana
??????? {
??????????? public $color;
????
??????????? public function __construct()
??????????? {
??????????????? $this->color = "Banana is yellow";
??????????? }
????
??????????? public function GetColor()
??????????? {
??????????????? return Apple::showColor();///使用作用域限定符
??????????? }
??????? }
????
??????? $banana = new Banana;
??????? echo $banana->GetColor();
??? ?>

程序运行结果:
1??? Banana is yellow
Program List:调用基类的方法
??? ????
??? class Fruit
??? {
??????? static function color()
?????? {
??????????? return "color";
??????? }
????
??????? static function showColor()
??????? {
?????????? echo "show " . self::color();
??????? }
??? }
????
??? class Apple extends Fruit
??? {
??????? static function color()
??????? {
??????????? return "red";
??????? }
??? }
????
??? Apple::showColor();
??? // output is "show color"!
????
??? ?>

程序运行结果:
1??? show color

?

?

?

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
function是什么意思function是什么意思Aug 04, 2023 am 10:33 AM

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果,其目的是封装一段可重复使用的代码,提高代码的可重用性和可维护性。

iOS的developer版和public版有什么区别?iOS的developer版和public版有什么区别?Mar 01, 2024 pm 12:55 PM

每年Apple发布新的iOS和macOS大版本之前,用户都可以提前几个月下载测试版抢先体验一番。由于公众和开发人员都使用该软件,所以苹果公司为两者推出了developer和public版即开发者测试版的公共测试版。iOS的developer版和public版有什么区别呢?从字面上的意思来说,developer版是开发者测试版,public版是公共测试版。developer版和public版面向的对象不同。developer版是苹果公司给开发者测试使用的,需要苹果开发者帐号才可以收到下载并升级,是

如何在Python中访问父类属性?如何在Python中访问父类属性?Aug 26, 2023 am 10:17 AM

Inobject-orientedprogramming,inheritanceallowsustocreatenewclassesthatinheritthepropertiesandmethodsofanexistingclass.Thispowerfulconceptenablescodereuse,modularity,andextensibilityinourprograms.Beforedivingintoaccessingparentclassattributes,let'shav

"enumerate()"函数在Python中的用途是什么?"enumerate()"函数在Python中的用途是什么?Sep 01, 2023 am 11:29 AM

在本文中,我们将了解enumerate()函数以及Python中“enumerate()”函数的用途。什么是enumerate()函数?Python的enumerate()函数接受数据集合作为参数并返回一个枚举对象。枚举对象以键值对的形式返回。key是每个item对应的索引,value是items。语法enumerate(iterable,start)参数iterable-传入的数据集合可以作为枚举对象返回,称为iterablestart-顾名思义,枚举对象的起始索引由start定义。如果我们忽

MySQL.proc表的作用和功能详解MySQL.proc表的作用和功能详解Mar 16, 2024 am 09:03 AM

MySQL.proc表的作用和功能详解MySQL是一种流行的关系型数据库管理系统,开发者在使用MySQL时常常会涉及到存储过程(StoredProcedure)的创建和管理。而MySQL.proc表则是一个非常重要的系统表,它存储了数据库中所有的存储过程的相关信息,包括存储过程的名称、定义、参数等。在本文中,我们将详细解释MySQL.proc表的作用和功能

在PHP中的file_exists()函数在PHP中的file_exists()函数Sep 14, 2023 am 08:29 AM

file_exists方法检查文件或目录是否存在。它接受要检查的文件或目录的路径作为参数。以下是它的用途-当您需要在处理之前知道文件是否存在时,它非常有用。这样,在创建新文件时使用此函数即可知道该文件是否已存在。语法file_exists($file_path)参数file_path-设置要检查是否存在的文件或目录的路径。必需。返回file_exists()方法返回。如果文件或目录存在,则返回TrueFalse,如果文件或目录不存在示例让我们看一个检查“candidate.txt”文件和即使文件

Vue.use函数的用法和作用Vue.use函数的用法和作用Jul 24, 2023 pm 06:09 PM

Vue.use函数的用法和作用Vue是一款流行的前端框架,它提供了许多有用的功能和功能。其中之一就是Vue.use函数,它可以让我们在Vue应用中使用插件。本文将介绍Vue.use函数的用法和作用,并且提供一些代码示例。Vue.use函数的基本用法非常简单,只需在Vue实例化之前调用它,并传入要使用的插件作为参数。下面是一个简单的示例://引入并使用插件

js函数function用法是什么js函数function用法是什么Oct 07, 2023 am 11:25 AM

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!